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