smtoff revision 1.3
11.1Smaxv#!/bin/sh
21.1Smaxv#
31.3Skre# $NetBSD: smtoff,v 1.3 2019/05/12 11:55:47 kre Exp $
41.1Smaxv#
51.1Smaxv# Public Domain.
61.1Smaxv#
71.1Smaxv
81.1Smaxv# PROVIDE: smtoff
91.1Smaxv# REQUIRE: root bootconf mountcritlocal tty
101.1Smaxv
111.1Smaxv$_rc_subr_loaded . /etc/rc.subr
121.1Smaxv
131.1Smaxvname="smtoff"
141.1Smaxvrcvar=$name
151.1Smaxv
161.1Smaxvstart_cmd="smtoff_start"
171.1Smaxvstop_cmd="smtoff_stop"
181.1Smaxv
191.1Smaxv# ------------------------------------------------------------------------------
201.1Smaxv
211.1Smaxv#
221.1Smaxv# The format of the output is:
231.1Smaxv#
241.1Smaxv#     ...
251.1Smaxv#     cpu0: SMT ID 1
261.1Smaxv#     ...
271.1Smaxv#
281.1Smaxv# Return the value.
291.1Smaxv#
301.1SmaxvGetSmtId() {
311.2Skre	cpuctl identify "$1" |
321.2Skre	while read cpuN smt id N junk
331.2Skre	do
341.2Skre		test -n "$junk" && continue
351.2Skre
361.2Skre		case "${smt} ${id}" in
371.2Skre		'SMT ID')
381.2Skre			case "$N" in
391.2Skre			[0-9]|[1-9][0-9]|[1-9][0-9]*[0-9])
401.2Skre				printf %s "$N"
411.2Skre				return
421.2Skre				;;
431.2Skre			esac
441.2Skre			;;
451.2Skre		esac
461.2Skre	done
471.1Smaxv}
481.1Smaxv
491.1Smaxv#
501.2Skre# The format of the output (without -n) would be:
511.1Smaxv#
521.1Smaxv#     hw.ncpu = 80
531.1Smaxv#
541.2Skre# so use -n to make life easy
551.2Skre#
561.1Smaxv# Return the value.
571.1Smaxv#
581.1SmaxvCountCPUs() {
591.2Skre	sysctl -n hw.ncpu
601.1Smaxv}
611.1Smaxv
621.1Smaxv# ------------------------------------------------------------------------------
631.1Smaxv
641.1Smaxv#
651.1Smaxv# Disable SMT. We skip cpu0.
661.1Smaxv#
671.1Smaxvsmtoff_start()
681.1Smaxv{
691.1Smaxv	ncpus=$(CountCPUs)
701.1Smaxv	i=1
711.1Smaxv
721.2Skre	while [ "$i" -lt "$ncpus" ]
731.1Smaxv	do
741.2Skre		smtid=$(GetSmtId "$i" 2>/dev/null)
751.2Skre
761.2Skre		case "$smtid" in
771.3Skre		'')			# Didn't get the ID? Then maybe no SMT.
781.2Skre			;;
791.1Smaxv
801.2Skre		0)			# The first thread is never disabled.
811.2Skre			;;
821.2Skre
831.2Skre		*)
841.2Skre			cpuctl offline "$i"
851.2Skre			;;
861.2Skre		esac
871.1Smaxv
881.1Smaxv		i=$(($i+1))
891.1Smaxv	done
901.1Smaxv}
911.1Smaxv
921.1Smaxv#
931.1Smaxv# Enable SMT. We basically turn on each CPU.
941.1Smaxv#
951.1Smaxvsmtoff_stop()
961.1Smaxv{
971.1Smaxv	ncpus=$(CountCPUs)
981.1Smaxv	i=1
991.1Smaxv
1001.2Skre	while [ "$i" -lt "$ncpus" ]
1011.1Smaxv	do
1021.2Skre		cpuctl online "$i"
1031.1Smaxv		i=$(($i+1))
1041.1Smaxv	done
1051.1Smaxv}
1061.1Smaxv
1071.1Smaxvload_rc_config $name
1081.1Smaxvrun_rc_command "$1"
109