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