smtoff revision 1.2
11.1Smaxv#!/bin/sh
21.1Smaxv#
31.2Skre# $NetBSD: smtoff,v 1.2 2019/05/12 00:24:03 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.2Skre	printf "error"
481.1Smaxv}
491.1Smaxv
501.1Smaxv#
511.2Skre# The format of the output (without -n) would be:
521.1Smaxv#
531.1Smaxv#     hw.ncpu = 80
541.1Smaxv#
551.2Skre# so use -n to make life easy
561.2Skre#
571.1Smaxv# Return the value.
581.1Smaxv#
591.1SmaxvCountCPUs() {
601.2Skre	sysctl -n hw.ncpu
611.1Smaxv}
621.1Smaxv
631.1Smaxv# ------------------------------------------------------------------------------
641.1Smaxv
651.1Smaxv#
661.1Smaxv# Disable SMT. We skip cpu0.
671.1Smaxv#
681.1Smaxvsmtoff_start()
691.1Smaxv{
701.1Smaxv	ncpus=$(CountCPUs)
711.1Smaxv	i=1
721.1Smaxv
731.2Skre	while [ "$i" -lt "$ncpus" ]
741.1Smaxv	do
751.2Skre		smtid=$(GetSmtId "$i" 2>/dev/null)
761.2Skre
771.2Skre		case "$smtid" in
781.2Skre		error)			# Didn't get the ID? Then maybe no SMT.
791.2Skre			;;
801.1Smaxv
811.2Skre		0)			# The first thread is never disabled.
821.2Skre			;;
831.2Skre
841.2Skre		*)
851.2Skre			cpuctl offline "$i"
861.2Skre			;;
871.2Skre		esac
881.1Smaxv
891.1Smaxv		i=$(($i+1))
901.1Smaxv	done
911.1Smaxv}
921.1Smaxv
931.1Smaxv#
941.1Smaxv# Enable SMT. We basically turn on each CPU.
951.1Smaxv#
961.1Smaxvsmtoff_stop()
971.1Smaxv{
981.1Smaxv	ncpus=$(CountCPUs)
991.1Smaxv	i=1
1001.1Smaxv
1011.2Skre	while [ "$i" -lt "$ncpus" ]
1021.1Smaxv	do
1031.2Skre		cpuctl online "$i"
1041.1Smaxv		i=$(($i+1))
1051.1Smaxv	done
1061.1Smaxv}
1071.1Smaxv
1081.1Smaxvload_rc_config $name
1091.1Smaxvrun_rc_command "$1"
110