1 1.1 maxv #!/bin/sh 2 1.1 maxv # 3 1.2 kre # $NetBSD: smtoff,v 1.2 2019/05/12 00:24:03 kre 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.2 kre cpuctl identify "$1" | 32 1.2 kre while read cpuN smt id N junk 33 1.2 kre do 34 1.2 kre test -n "$junk" && continue 35 1.2 kre 36 1.2 kre case "${smt} ${id}" in 37 1.2 kre 'SMT ID') 38 1.2 kre case "$N" in 39 1.2 kre [0-9]|[1-9][0-9]|[1-9][0-9]*[0-9]) 40 1.2 kre printf %s "$N" 41 1.2 kre return 42 1.2 kre ;; 43 1.2 kre esac 44 1.2 kre ;; 45 1.2 kre esac 46 1.2 kre done 47 1.2 kre printf "error" 48 1.1 maxv } 49 1.1 maxv 50 1.1 maxv # 51 1.2 kre # The format of the output (without -n) would be: 52 1.1 maxv # 53 1.1 maxv # hw.ncpu = 80 54 1.1 maxv # 55 1.2 kre # so use -n to make life easy 56 1.2 kre # 57 1.1 maxv # Return the value. 58 1.1 maxv # 59 1.1 maxv CountCPUs() { 60 1.2 kre sysctl -n hw.ncpu 61 1.1 maxv } 62 1.1 maxv 63 1.1 maxv # ------------------------------------------------------------------------------ 64 1.1 maxv 65 1.1 maxv # 66 1.1 maxv # Disable SMT. We skip cpu0. 67 1.1 maxv # 68 1.1 maxv smtoff_start() 69 1.1 maxv { 70 1.1 maxv ncpus=$(CountCPUs) 71 1.1 maxv i=1 72 1.1 maxv 73 1.2 kre while [ "$i" -lt "$ncpus" ] 74 1.1 maxv do 75 1.2 kre smtid=$(GetSmtId "$i" 2>/dev/null) 76 1.2 kre 77 1.2 kre case "$smtid" in 78 1.2 kre error) # Didn't get the ID? Then maybe no SMT. 79 1.2 kre ;; 80 1.1 maxv 81 1.2 kre 0) # The first thread is never disabled. 82 1.2 kre ;; 83 1.2 kre 84 1.2 kre *) 85 1.2 kre cpuctl offline "$i" 86 1.2 kre ;; 87 1.2 kre esac 88 1.1 maxv 89 1.1 maxv i=$(($i+1)) 90 1.1 maxv done 91 1.1 maxv } 92 1.1 maxv 93 1.1 maxv # 94 1.1 maxv # Enable SMT. We basically turn on each CPU. 95 1.1 maxv # 96 1.1 maxv smtoff_stop() 97 1.1 maxv { 98 1.1 maxv ncpus=$(CountCPUs) 99 1.1 maxv i=1 100 1.1 maxv 101 1.2 kre while [ "$i" -lt "$ncpus" ] 102 1.1 maxv do 103 1.2 kre cpuctl online "$i" 104 1.1 maxv i=$(($i+1)) 105 1.1 maxv done 106 1.1 maxv } 107 1.1 maxv 108 1.1 maxv load_rc_config $name 109 1.1 maxv run_rc_command "$1" 110