Home | History | Annotate | Line # | Download | only in rc.d
      1 #!/bin/sh
      2 #
      3 # $NetBSD: smtoff,v 1.6 2020/09/08 12:52:18 martin Exp $
      4 #
      5 # Public Domain.
      6 #
      7 
      8 # PROVIDE: smtoff
      9 # REQUIRE: root bootconf CRITLOCALMOUNTED tty
     10 
     11 $_rc_subr_loaded . /etc/rc.subr
     12 
     13 name="smtoff"
     14 rcvar=$name
     15 
     16 start_cmd="smtoff_start"
     17 stop_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 #
     30 GetSmtId() {
     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 }
     48 
     49 CountCPUs() {
     50 	sysctl -n hw.ncpu
     51 }
     52 
     53 # ------------------------------------------------------------------------------
     54 
     55 #
     56 # Disable SMT. We skip cpu0.
     57 #
     58 smtoff_start()
     59 {
     60 	ncpus=$(CountCPUs)
     61 	i=1
     62 
     63 	while [ "$i" -lt "$ncpus" ]
     64 	do
     65 		smtid=$(GetSmtId "$i" 2>/dev/null)
     66 
     67 		case "$smtid" in
     68 		'')			# Didn't get the ID? Then maybe no SMT.
     69 			;;
     70 
     71 		0)			# The first thread is never disabled.
     72 			;;
     73 
     74 		*)
     75 			cpuctl offline "$i"
     76 			;;
     77 		esac
     78 
     79 		i=$(($i+1))
     80 	done
     81 }
     82 
     83 #
     84 # Enable SMT. We basically turn on each CPU.
     85 #
     86 smtoff_stop()
     87 {
     88 	ncpus=$(CountCPUs)
     89 	i=1
     90 
     91 	while [ "$i" -lt "$ncpus" ]
     92 	do
     93 		cpuctl online "$i"
     94 		i=$(($i+1))
     95 	done
     96 }
     97 
     98 load_rc_config $name
     99 run_rc_command "$1"
    100