1 1.1 maxv #!/bin/sh 2 1.1 maxv # 3 1.6 martin # $NetBSD: smtoff,v 1.6 2020/09/08 12:52:18 martin 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.6 martin # REQUIRE: root bootconf CRITLOCALMOUNTED 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 CountCPUs() { 50 1.2 kre sysctl -n hw.ncpu 51 1.1 maxv } 52 1.1 maxv 53 1.1 maxv # ------------------------------------------------------------------------------ 54 1.1 maxv 55 1.1 maxv # 56 1.1 maxv # Disable SMT. We skip cpu0. 57 1.1 maxv # 58 1.1 maxv smtoff_start() 59 1.1 maxv { 60 1.1 maxv ncpus=$(CountCPUs) 61 1.1 maxv i=1 62 1.1 maxv 63 1.2 kre while [ "$i" -lt "$ncpus" ] 64 1.1 maxv do 65 1.2 kre smtid=$(GetSmtId "$i" 2>/dev/null) 66 1.2 kre 67 1.2 kre case "$smtid" in 68 1.3 kre '') # Didn't get the ID? Then maybe no SMT. 69 1.2 kre ;; 70 1.1 maxv 71 1.2 kre 0) # The first thread is never disabled. 72 1.2 kre ;; 73 1.2 kre 74 1.2 kre *) 75 1.2 kre cpuctl offline "$i" 76 1.2 kre ;; 77 1.2 kre esac 78 1.1 maxv 79 1.1 maxv i=$(($i+1)) 80 1.1 maxv done 81 1.1 maxv } 82 1.1 maxv 83 1.1 maxv # 84 1.1 maxv # Enable SMT. We basically turn on each CPU. 85 1.1 maxv # 86 1.1 maxv smtoff_stop() 87 1.1 maxv { 88 1.1 maxv ncpus=$(CountCPUs) 89 1.1 maxv i=1 90 1.1 maxv 91 1.2 kre while [ "$i" -lt "$ncpus" ] 92 1.1 maxv do 93 1.2 kre cpuctl online "$i" 94 1.1 maxv i=$(($i+1)) 95 1.1 maxv done 96 1.1 maxv } 97 1.1 maxv 98 1.1 maxv load_rc_config $name 99 1.1 maxv run_rc_command "$1" 100