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