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