52 lines
1.8 KiB
Bash
Executable file
52 lines
1.8 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# Disable deep CPU C-states so Vcore stays at a higher baseline and the VRM
|
|
# doesn't have to slam from C6/C7 idle back to full current on every workload
|
|
# transient. Reduces transient-demand magnitude; does NOT fix root-cause PSU
|
|
# or VRM degradation, but often reduces crash frequency on aging boards.
|
|
#
|
|
# Leaves C0 + C1 enabled (basic halt). Disables C2+ (package C-states).
|
|
#
|
|
# Reversible: run with `--restore` to re-enable everything.
|
|
|
|
set -o pipefail
|
|
|
|
log() { printf '[%s] apricot-cstate-tune: %s\n' "$(date --iso-8601=s)" "$*"; }
|
|
|
|
mode="${1:-apply}"
|
|
|
|
case "$mode" in
|
|
apply)
|
|
n_cpus=$(ls -d /sys/devices/system/cpu/cpu[0-9]* 2>/dev/null | wc -l)
|
|
disabled=0
|
|
for s in /sys/devices/system/cpu/cpu*/cpuidle/state*/disable; do
|
|
[ -w "$s" ] || continue
|
|
idx="${s%/disable}"; idx="${idx##*state}"
|
|
# Keep states 0 (POLL/C0) and 1 (C1/halt); disable 2+.
|
|
if (( idx >= 2 )); then
|
|
echo 1 > "$s" 2>/dev/null && disabled=$(( disabled + 1 ))
|
|
fi
|
|
done
|
|
log "disabled $disabled idle-state entries across $n_cpus CPUs (kept C0+C1)"
|
|
;;
|
|
restore)
|
|
enabled=0
|
|
for s in /sys/devices/system/cpu/cpu*/cpuidle/state*/disable; do
|
|
[ -w "$s" ] || continue
|
|
echo 0 > "$s" 2>/dev/null && enabled=$(( enabled + 1 ))
|
|
done
|
|
log "re-enabled $enabled idle-state entries"
|
|
;;
|
|
status)
|
|
printf 'cpu0 idle states:\n'
|
|
for d in /sys/devices/system/cpu/cpu0/cpuidle/state*; do
|
|
[ -d "$d" ] || continue
|
|
name=$(cat "$d/name" 2>/dev/null)
|
|
dis=$(cat "$d/disable" 2>/dev/null)
|
|
printf ' %s disable=%s name=%s\n' "$(basename "$d")" "$dis" "$name"
|
|
done
|
|
;;
|
|
*)
|
|
echo "usage: $0 {apply|restore|status}" >&2
|
|
exit 2
|
|
;;
|
|
esac
|