11.1Smaxv#!/bin/sh 21.1Smaxv# 31.6Smartin# $NetBSD: smtoff,v 1.6 2020/09/08 12:52:18 martin Exp $ 41.1Smaxv# 51.1Smaxv# Public Domain. 61.1Smaxv# 71.1Smaxv 81.1Smaxv# PROVIDE: smtoff 91.6Smartin# REQUIRE: root bootconf CRITLOCALMOUNTED 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.1SmaxvCountCPUs() { 501.2Skre sysctl -n hw.ncpu 511.1Smaxv} 521.1Smaxv 531.1Smaxv# ------------------------------------------------------------------------------ 541.1Smaxv 551.1Smaxv# 561.1Smaxv# Disable SMT. We skip cpu0. 571.1Smaxv# 581.1Smaxvsmtoff_start() 591.1Smaxv{ 601.1Smaxv ncpus=$(CountCPUs) 611.1Smaxv i=1 621.1Smaxv 631.2Skre while [ "$i" -lt "$ncpus" ] 641.1Smaxv do 651.2Skre smtid=$(GetSmtId "$i" 2>/dev/null) 661.2Skre 671.2Skre case "$smtid" in 681.3Skre '') # Didn't get the ID? Then maybe no SMT. 691.2Skre ;; 701.1Smaxv 711.2Skre 0) # The first thread is never disabled. 721.2Skre ;; 731.2Skre 741.2Skre *) 751.2Skre cpuctl offline "$i" 761.2Skre ;; 771.2Skre esac 781.1Smaxv 791.1Smaxv i=$(($i+1)) 801.1Smaxv done 811.1Smaxv} 821.1Smaxv 831.1Smaxv# 841.1Smaxv# Enable SMT. We basically turn on each CPU. 851.1Smaxv# 861.1Smaxvsmtoff_stop() 871.1Smaxv{ 881.1Smaxv ncpus=$(CountCPUs) 891.1Smaxv i=1 901.1Smaxv 911.2Skre while [ "$i" -lt "$ncpus" ] 921.1Smaxv do 931.2Skre cpuctl online "$i" 941.1Smaxv i=$(($i+1)) 951.1Smaxv done 961.1Smaxv} 971.1Smaxv 981.1Smaxvload_rc_config $name 991.1Smaxvrun_rc_command "$1" 100