smtoff revision 1.1
11.1Smaxv#!/bin/sh
21.1Smaxv#
31.1Smaxv# $NetBSD: smtoff,v 1.1 2019/05/11 19:31:03 maxv 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.1Smaxv	smtid=$(cpuctl identify $1 | grep "SMT ID" | cut -d " " -f 4)
321.1Smaxv	case $smtid in
331.1Smaxv		[0-9]*)
341.1Smaxv			echo "$smtid" ;;
351.1Smaxv		*)
361.1Smaxv			echo "error" ;;
371.1Smaxv	esac
381.1Smaxv}
391.1Smaxv
401.1Smaxv#
411.1Smaxv# The format of the output is:
421.1Smaxv#
431.1Smaxv#     hw.ncpu = 80
441.1Smaxv#
451.1Smaxv# Return the value.
461.1Smaxv#
471.1SmaxvCountCPUs() {
481.1Smaxv	ncpus=$(sysctl hw.ncpu | cut -d " " -f 3)
491.1Smaxv	echo "$ncpus"
501.1Smaxv}
511.1Smaxv
521.1Smaxv# ------------------------------------------------------------------------------
531.1Smaxv
541.1Smaxv#
551.1Smaxv# Disable SMT. We skip cpu0.
561.1Smaxv#
571.1Smaxvsmtoff_start()
581.1Smaxv{
591.1Smaxv	ncpus=$(CountCPUs)
601.1Smaxv	i=1
611.1Smaxv
621.1Smaxv	while [ $i -lt $ncpus ]
631.1Smaxv	do
641.1Smaxv		smtid=$(GetSmtId "$i")
651.1Smaxv
661.1Smaxv		# Didn't get the ID? Then maybe no SMT.
671.1Smaxv		if [ "$smtid" = "error" ]; then
681.1Smaxv			i=$(($i+1))
691.1Smaxv			continue
701.1Smaxv		fi
711.1Smaxv
721.1Smaxv		# The first thread is never disabled.
731.1Smaxv		if [ $smtid -eq 0 ]; then
741.1Smaxv			i=$(($i+1))
751.1Smaxv			continue
761.1Smaxv		fi
771.1Smaxv
781.1Smaxv		cmd="cpuctl offline $i"
791.1Smaxv		$cmd
801.1Smaxv		i=$(($i+1))
811.1Smaxv	done
821.1Smaxv}
831.1Smaxv
841.1Smaxv#
851.1Smaxv# Enable SMT. We basically turn on each CPU.
861.1Smaxv#
871.1Smaxvsmtoff_stop()
881.1Smaxv{
891.1Smaxv	ncpus=$(CountCPUs)
901.1Smaxv	i=1
911.1Smaxv
921.1Smaxv	while [ $i -lt $ncpus ]
931.1Smaxv	do
941.1Smaxv		cmd="cpuctl online $i"
951.1Smaxv		$cmd
961.1Smaxv		i=$(($i+1))
971.1Smaxv	done
981.1Smaxv}
991.1Smaxv
1001.1Smaxvload_rc_config $name
1011.1Smaxvrun_rc_command "$1"
102