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