smtoff revision 1.3
11.1Smaxv#!/bin/sh 21.1Smaxv# 31.3Skre# $NetBSD: smtoff,v 1.3 2019/05/12 11:55:47 kre Exp $ 41.1Smaxv# 51.1Smaxv# Public Domain. 61.1Smaxv# 71.1Smaxv 81.1Smaxv# PROVIDE: smtoff 91.1Smaxv# REQUIRE: root bootconf mountcritlocal tty 101.1Smaxv 111.1Smaxv$_rc_subr_loaded . /etc/rc.subr 121.1Smaxv 131.1Smaxvname="smtoff" 141.1Smaxvrcvar=$name 151.1Smaxv 161.1Smaxvstart_cmd="smtoff_start" 171.1Smaxvstop_cmd="smtoff_stop" 181.1Smaxv 191.1Smaxv# ------------------------------------------------------------------------------ 201.1Smaxv 211.1Smaxv# 221.1Smaxv# The format of the output is: 231.1Smaxv# 241.1Smaxv# ... 251.1Smaxv# cpu0: SMT ID 1 261.1Smaxv# ... 271.1Smaxv# 281.1Smaxv# Return the value. 291.1Smaxv# 301.1SmaxvGetSmtId() { 311.2Skre cpuctl identify "$1" | 321.2Skre while read cpuN smt id N junk 331.2Skre do 341.2Skre test -n "$junk" && continue 351.2Skre 361.2Skre case "${smt} ${id}" in 371.2Skre 'SMT ID') 381.2Skre case "$N" in 391.2Skre [0-9]|[1-9][0-9]|[1-9][0-9]*[0-9]) 401.2Skre printf %s "$N" 411.2Skre return 421.2Skre ;; 431.2Skre esac 441.2Skre ;; 451.2Skre esac 461.2Skre done 471.1Smaxv} 481.1Smaxv 491.1Smaxv# 501.2Skre# The format of the output (without -n) would be: 511.1Smaxv# 521.1Smaxv# hw.ncpu = 80 531.1Smaxv# 541.2Skre# so use -n to make life easy 551.2Skre# 561.1Smaxv# Return the value. 571.1Smaxv# 581.1SmaxvCountCPUs() { 591.2Skre sysctl -n hw.ncpu 601.1Smaxv} 611.1Smaxv 621.1Smaxv# ------------------------------------------------------------------------------ 631.1Smaxv 641.1Smaxv# 651.1Smaxv# Disable SMT. We skip cpu0. 661.1Smaxv# 671.1Smaxvsmtoff_start() 681.1Smaxv{ 691.1Smaxv ncpus=$(CountCPUs) 701.1Smaxv i=1 711.1Smaxv 721.2Skre while [ "$i" -lt "$ncpus" ] 731.1Smaxv do 741.2Skre smtid=$(GetSmtId "$i" 2>/dev/null) 751.2Skre 761.2Skre case "$smtid" in 771.3Skre '') # Didn't get the ID? Then maybe no SMT. 781.2Skre ;; 791.1Smaxv 801.2Skre 0) # The first thread is never disabled. 811.2Skre ;; 821.2Skre 831.2Skre *) 841.2Skre cpuctl offline "$i" 851.2Skre ;; 861.2Skre esac 871.1Smaxv 881.1Smaxv i=$(($i+1)) 891.1Smaxv done 901.1Smaxv} 911.1Smaxv 921.1Smaxv# 931.1Smaxv# Enable SMT. We basically turn on each CPU. 941.1Smaxv# 951.1Smaxvsmtoff_stop() 961.1Smaxv{ 971.1Smaxv ncpus=$(CountCPUs) 981.1Smaxv i=1 991.1Smaxv 1001.2Skre while [ "$i" -lt "$ncpus" ] 1011.1Smaxv do 1021.2Skre cpuctl online "$i" 1031.1Smaxv i=$(($i+1)) 1041.1Smaxv done 1051.1Smaxv} 1061.1Smaxv 1071.1Smaxvload_rc_config $name 1081.1Smaxvrun_rc_command "$1" 109