1 #!/bin/sh 2 # 3 # $NetBSD: smtoff,v 1.1 2019/05/11 19:31:03 maxv Exp $ 4 # 5 # Public Domain. 6 # 7 8 # PROVIDE: smtoff 9 # REQUIRE: root bootconf mountcritlocal tty 10 11 $_rc_subr_loaded . /etc/rc.subr 12 13 name="smtoff" 14 rcvar=$name 15 16 start_cmd="smtoff_start" 17 stop_cmd="smtoff_stop" 18 19 # ------------------------------------------------------------------------------ 20 21 # 22 # The format of the output is: 23 # 24 # ... 25 # cpu0: SMT ID 1 26 # ... 27 # 28 # Return the value. 29 # 30 GetSmtId() { 31 smtid=$(cpuctl identify $1 | grep "SMT ID" | cut -d " " -f 4) 32 case $smtid in 33 [0-9]*) 34 echo "$smtid" ;; 35 *) 36 echo "error" ;; 37 esac 38 } 39 40 # 41 # The format of the output is: 42 # 43 # hw.ncpu = 80 44 # 45 # Return the value. 46 # 47 CountCPUs() { 48 ncpus=$(sysctl hw.ncpu | cut -d " " -f 3) 49 echo "$ncpus" 50 } 51 52 # ------------------------------------------------------------------------------ 53 54 # 55 # Disable SMT. We skip cpu0. 56 # 57 smtoff_start() 58 { 59 ncpus=$(CountCPUs) 60 i=1 61 62 while [ $i -lt $ncpus ] 63 do 64 smtid=$(GetSmtId "$i") 65 66 # Didn't get the ID? Then maybe no SMT. 67 if [ "$smtid" = "error" ]; then 68 i=$(($i+1)) 69 continue 70 fi 71 72 # The first thread is never disabled. 73 if [ $smtid -eq 0 ]; then 74 i=$(($i+1)) 75 continue 76 fi 77 78 cmd="cpuctl offline $i" 79 $cmd 80 i=$(($i+1)) 81 done 82 } 83 84 # 85 # Enable SMT. We basically turn on each CPU. 86 # 87 smtoff_stop() 88 { 89 ncpus=$(CountCPUs) 90 i=1 91 92 while [ $i -lt $ncpus ] 93 do 94 cmd="cpuctl online $i" 95 $cmd 96 i=$(($i+1)) 97 done 98 } 99 100 load_rc_config $name 101 run_rc_command "$1" 102