summarylogtreecommitdiffstats
path: root/throttlectl
diff options
context:
space:
mode:
Diffstat (limited to 'throttlectl')
-rwxr-xr-xthrottlectl236
1 files changed, 105 insertions, 131 deletions
diff --git a/throttlectl b/throttlectl
index 202ed0dea277..714c12acdf49 100755
--- a/throttlectl
+++ b/throttlectl
@@ -15,7 +15,7 @@ throttle_help() {
"${0} ht {on,off} - Hyperthreads\n"\
"${0} gov {cut,full} - CPU Governor\n"\
"${0} gpu {cut,full} - GPU runtime powersaving (only Nvidia ATM)\n"\
- "${0} backlight {0,1,2} - Backlight brightness (laptops only?)\n" \
+ "${0} backlight {cut,full} - Backlight brightness (laptops only?)\n" \
"\nAll options are stackable and take {{cut,powersave,start},{full,performace,stop},{check,status}}\n"
exit
}
@@ -29,66 +29,6 @@ config_help() {
exit
}
-throttle_ht() {
- [[ -f /sys/devices/system/cpu/smt/control ]] && \
- printf "${HYPERTHREADS}" > /sys/devices/system/cpu/smt/control &
-}
-
-check_ht() {
- [[ -f /sys/devices/system/cpu/smt/control ]] && \
- echo -e "\nHyperthreads\n/sys/devices/system/cpu/smt/\n"\
- "control\t$(cat /sys/devices/system/cpu/smt/control)"
-}
-
-throttle_gov() {
- for i in /sys/bus/cpu/drivers/processor/cpu*/cpufreq/scaling_governor; do \
- [[ "$(printf ${i} | tr -cd [:digit:])" -ge "${CORES}" && \
- "$(cat /sys/devices/system/cpu/cpu$(printf ${i} | tr -cd [:digit:])/online)" == 0 ]] && \
- continue ; printf "${GOVERNOR}" > "${i}" & done &
-}
-
-check_gov() {
- printf "\nCPU Governor\n/sys/bus/cpu/drivers/processor/cpu*/cpufreq/scaling_governor\n"
- for i in /sys/bus/cpu/drivers/processor/cpu*/cpufreq/scaling_governor; do \
- printf " ${i}\n$(cat ${i})\n"; done | sed 's|/sys/bus/cpu/drivers/processor/||g; s|/.*||g; N;s|\n|\t|'
-}
-
-throttle_turbo() {
- [[ -f /sys/devices/system/cpu/intel_pstate/no_turbo ]] && \
- printf "${XPSTURBO}" > /sys/devices/system/cpu/intel_pstate/no_turbo &
-}
-
-check_turbo() {
- [[ -f /sys/devices/system/cpu/intel_pstate/no_turbo ]] && \
- echo -e "\nDisable Intel P-State Turbo\n/sys/devices/system/cpu/intel_pstate/\n"\
- "no_turbo\t$(cat /sys/devices/system/cpu/intel_pstate/no_turbo)"
-}
-
-throttle_backlight() {
- [[ -f /sys/class/backlight/acpi_video0 ]] && \
- for i in /sys/class/backlight/acpi_video*/brightness; do \
- printf "${BACKLIGHT}" > "${i}" & done &
-}
-
-check_backlight() {
- [[ -f /sys/class/backlight/acpi_video0 ]] && \
- printf "\nBacklight\n/sys/class/backlight/\n" && \
- for i in /sys/class/backlight/acpi_video*/brightness; do \
- printf " ${i}\n$(cat ${i})\n"; done | sed 's|/sys/class/backlight/||g; s|/.*||g; N;s|\n|\t|'
-}
-
-throttle_nvpm() {
- [[ -z "$(command -v nvidia-settings)" ]] && \
- printf "nvidia-settings not found; only nvidia currently supported" || \
- DISPLAY=":0.0" nvidia-settings -a [gpu:0]/GPUPowerMizerMode="${NVPM}" > /dev/null &
-}
-
-check_nvpm() {
- [[ -n "$(command -v nvidia-settings)" ]] && \
- printf "\nNvidia PowerMizer\n " && \
- DISPLAY=":0.0" nvidia-settings -q [gpu:0]/GPUPowerMizerMode | grep "Attribute" | sed 's|.*\[||g;s|\]):||g;s| |\t|g;s|\.$||g'
-}
-
throttle_system() {
# ENERGY_PERF_BIAS
[[ -n "$(command -v x86_energy_perf_policy)" ]] && \
@@ -107,53 +47,53 @@ throttle_system() {
printf "${NMIDOG}" > /proc/sys/kernel/watchdog &
# SATA link power management
- for i in /sys/class/scsi_host/host*/link_power_management_policy; do [[ -f "${i}" ]] && \
- printf "${POLICY}" > "${i}" & done &
+ [[ -n "$(ls /sys/class/scsi_host/host*/link_power_management_policy 2> /dev/null)" ]] && \
+ printf "${POLICY}" | tee /sys/class/scsi_host/host*/link_power_management_policy > /dev/null 2>&1 &
# Hard drives
[[ -n "$(command -v hdparm)" ]] && \
- hdparm -qB "${APM}" -qM "${AAM}" /dev/[hs]d[a-z] 2> /dev/null &
+ hdparm -qB "${APM}" -qM "${AAM}" /dev/[hs]d[a-z] > /dev/null 2>&1 &
# Block device autosuspend
- for i in /sys/block/*/device/power/autosuspend_delay_ms; do \
- printf -- "${DISKAUTOSUSPEND}" > "${i}" & done &
+ [[ -n "$(ls /sys/block/*/device/power/autosuspend_delay_ms 2> /dev/null)" ]] && \
+ printf -- "${DISKAUTOSUSPEND}" | tee /sys/block/*/device/power/autosuspend_delay_ms > /dev/null 2>&1 &
# Runtime power management for devices (with exceptions for devices by VID:PID)
for i in /sys/{class/*,bus/*/devices}/*/power/control; do \
[[ "${CONTROL}" == "auto" ]] && \
- [[ -n "$(printf ${i} | grep msr[${CORES}-$((${CORES} * 2 - 1))])" || \
- -n "$(printf ${i} | grep machinecheck[${CORES}-$((${CORES} * 2 - 1))])" || \
- -n "$(ls $(printf ${i} | sed 's|power.*||g')/*/ | grep 046D\:C52B)" ]] && \
- continue ; printf "${CONTROL}" > "${i}" & done &
+ [[ -n "$(ls $(printf ${i} | sed 's|power.*||g')/*/ | grep 046D\:C52B)" ]] && \
+ continue ; CONTROLS+="${i} "; done
+ [[ -n "${CONTROLS}" ]] && printf "${CONTROL}" | tee "${CONTROLS}" > /dev/null 2>&1 &
# USB Autosuspend (with exceptions for devices by VID:PID)
for i in /sys/bus/usb/devices/*/power/autosuspend{,_delay_ms}; do \
[[ "${AUTOSUSPEND}" == "1" ]] && \
[[ -n "$(ls $(printf ${i} | sed 's|power.*||g')/*/ | grep 046D\:C52B)" ]] && \
- continue ; printf -- "${AUTOSUSPEND}" > "${i}" & done &
+ continue ; AUTOSUSPENDS+="${i} "; done
+ [[ -n "${AUTOSUSPENDS}" ]] && printf -- "${AUTOSUSPEND}" | tee "${AUTOSUSPENDS}" > /dev/null 2>&1 &
# Powersaving for modules
- for i in /sys/module/*/parameters/power_save; do \
- printf "${POWERSAVE}" > "${i}" & done &
- for i in /sys/module/*/parameters/power_save_controller; do \
- printf "${CONTROLLER}" > "${i}" & done &
+ [[ -n "$(ls /sys/module/*/parameters/power_save 2> /dev/null)" ]] && \
+ printf "${POWERSAVE}" | tee /sys/module/*/parameters/power_save > /dev/null 2>&1 &
+ [[ -n "$(ls /sys/module/*/parameters/power_save_controller 2> /dev/null)" ]] && \
+ printf "${CONTROLLER}" | tee /sys/module/*/parameters/power_save_controller > /dev/null 2>&1 &
# Network powersaving
for i in /sys/class/net/wl*; do \
[[ -n "$(command -v iw)" ]] && \
- iw dev "$(printf ${i} | sed 's/^.*wl/wl/')" set power_save "${WLPOWERSAVE}" 2> /dev/null & done &
+ iw dev "$(printf ${i} | sed 's/^.*wl/wl/')" set power_save "${WLPOWERSAVE}" > /dev/null 2>&1 & done &
for i in /sys/class/net/e*; do \
[[ -n "$(command -v ethtool)" ]] && \
- ethtool -s "$(printf ${i} | sed 's/^.*e/e/')" wol "${WOLA}" 2> /dev/null & done &
- for i in /sys/class/net/*/device/power/wakeup; do \
- printf "${WOLB}" > "${i}" & done &
+ ethtool -s "$(printf ${i} | sed 's/^.*e/e/')" wol "${WOLA}" > /dev/null 2>&1 & done &
+ [[ -n "$(ls /sys/class/net/*/device/power/wakeup 2> /dev/null)" ]] && \
+ printf "${WOLB}" | tee /sys/class/net/*/device/power/wakeup > /dev/null 2>&1 &
# LEDs
- for i in /sys/class/leds/*/brightness; do \
- printf "${LEDBRIGHT}" > "${i}" & done &
+ [[ -n "$(ls /sys/class/leds/*/brightness 2> /dev/null)" ]] && \
+ printf "${LEDBRIGHT}" | tee /sys/class/leds/*/brightness > /dev/null 2>&1 &
# Save state for frontend
- printf "$SYSTEM" > /etc/throttle.d/systemstate &
+ printf "${SYSTEM}" > /etc/throttle.d/systemstate &
}
check_system() {
@@ -211,22 +151,77 @@ check_system() {
printf " ${i}\n$(cat ${i})\n"; done | sed 's|/sys/class/leds/||g; s|/brightness||g; s|/.*||g; N;s|\n|\t|'
}
+throttle_ht() {
+ [[ -f /sys/devices/system/cpu/smt/control ]] && \
+ printf "${HYPERTHREADS}" > /sys/devices/system/cpu/smt/control &
+}
+
+check_ht() {
+ [[ -f /sys/devices/system/cpu/smt/control ]] && \
+ echo -e "\nHyperthreads\n/sys/devices/system/cpu/smt/\n"\
+ "control\t$(cat /sys/devices/system/cpu/smt/control)"
+}
+
+throttle_turbo() {
+ [[ -f /sys/devices/system/cpu/intel_pstate/no_turbo ]] && \
+ printf "${XPSTURBO}" > /sys/devices/system/cpu/intel_pstate/no_turbo &
+}
+
+check_turbo() {
+ [[ -f /sys/devices/system/cpu/intel_pstate/no_turbo ]] && \
+ echo -e "\nDisable Intel P-State Turbo\n/sys/devices/system/cpu/intel_pstate/\n"\
+ "no_turbo\t$(cat /sys/devices/system/cpu/intel_pstate/no_turbo)"
+}
+
+throttle_gov() {
+ [[ -n "$(ls /sys/bus/cpu/drivers/processor/cpu*/cpufreq/scaling_governor 2> /dev/null)" ]] && \
+ printf "${GOVERNOR}" | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor > /dev/null 2>&1 &
+}
+
+check_gov() {
+ [[ -n "$(ls /sys/bus/cpu/drivers/processor/cpu*/cpufreq/scaling_governor 2> /dev/null)" ]] && \
+ printf "\nCPU Governor\n/sys/bus/cpu/drivers/processor/cpu*/cpufreq/scaling_governor\n"
+ for i in /sys/bus/cpu/drivers/processor/cpu*/cpufreq/scaling_governor; do \
+ printf " ${i}\n$(cat ${i})\n"; done | sed 's|/sys/bus/cpu/drivers/processor/||g; s|/.*||g; N;s|\n|\t|'
+}
+
+throttle_nvpm() {
+ [[ -z "$(command -v nvidia-settings)" ]] && \
+ printf "nvidia-settings not found; only nvidia currently supported" || \
+ DISPLAY=":0.0" nvidia-settings -a [gpu:0]/GPUPowerMizerMode="${NVPM}" > /dev/null 2>&1 && \
+ check_nvpm | tail -c 2 | tr -d '\n' > /etc/throttle.d/powermizer &
+}
+
+check_nvpm() {
+ [[ -n "$(command -v nvidia-settings)" ]] && \
+ printf "\nNvidia PowerMizer\n " && \
+ DISPLAY=":0.0" nvidia-settings -q [gpu:0]/GPUPowerMizerMode 2>/dev/null | grep "Attribute" | sed 's|.*\[||g;s|\]):||g;s| |\t|g;s|\.$||g'
+}
+
+throttle_backlight() {
+ [[ -n "$(ls /sys/class/backlight/*/brightness 2> /dev/null)" ]] && \
+ [[ "$BACKLIGHT" == "0" ]] && printf "${BACKLIGHT}" | tee /sys/class/backlight/*/brightness > /dev/null 2>&1 || \
+ for i in /sys/class/backlight/*/brightness; do \
+ cat "${i/%brightness/max_brightness}" > "${i}" & done &
+}
+
+check_backlight() {
+ [[ -n "$(ls -d /sys/class/backlight/* 2> /dev/null)" ]] && \
+ printf "\nBacklight\n/sys/class/backlight/\n" && \
+ for i in /sys/class/backlight/*/brightness; do \
+ printf " ${i}\n$(cat ${i})\n"; done | sed 's|/sys/class/backlight/||g; s|/.*||g; N;s|\n|\t|'
+}
+
while (( "$#" )); do
case "$1" in
sys)
- case "${2}" in
- cut|off|powersave|start)
- [[ -f /etc/throttle.d/powersave ]] && . /etc/throttle.d/powersave || config_help; SYSTEM="0"
- ;;
- full|on|performance|stop)
- [[ -f /etc/throttle.d/performance ]] && . /etc/throttle.d/performance || config_help; SYSTEM="1"
- ;;
- check|status)
- check_system
- ;;
- esac
- [[ -n "$SYSTEM" ]] && throttle_system
- shift "2"
+ case "${2}" in \
+ cut|off|powersave|start) \
+ [[ -f /etc/throttle.d/powersave ]] && . /etc/throttle.d/powersave || config_help; SYSTEM="0" ;; \
+ full|on|performance|stop) \
+ [[ -f /etc/throttle.d/performance ]] && . /etc/throttle.d/performance || config_help; SYSTEM="1" ;; \
+ check|status) check_system ;; esac
+ [[ -n "$SYSTEM" ]] && throttle_system; shift "2"
unset ENERGYPERF LAPTOP DIRTYWBC NMIDOG POLICY APM AAM CONTROL AUTOSUSPEND POWERSAVE CONTROLLER \
WLPOWERSAVE WOLA WOLB LEDBRIGHT SYSTEM
;;
@@ -236,8 +231,7 @@ while (( "$#" )); do
cut|off|powersave|start) XPSTURBO="1" ;; \
full|on|performance|stop) XPSTURBO="0" ;; \
check|status) check_turbo ;; esac
- [[ -n "${XPSTURBO}" ]] && throttle_turbo
- shift "2"
+ [[ -n "${XPSTURBO}" ]] && throttle_turbo; shift "2"
unset XPSTURBO
;;
ht)
@@ -246,8 +240,7 @@ while (( "$#" )); do
cut|off|powersave|start) HYPERTHREADS="off" ;; \
full|on|performance|stop) HYPERTHREADS="on" ;; \
check|status) check_ht ;; esac
- [[ -n "${HYPERTHREADS}" ]] && throttle_ht
- shift "2"
+ [[ -n "${HYPERTHREADS}" ]] && throttle_ht; shift "2"
unset HYPERTHREADS
;;
gov|cpu)
@@ -256,8 +249,7 @@ while (( "$#" )); do
cut|off|powersave|start) GOVERNOR="powersave" ;; \
full|on|performance|stop) GOVERNOR="performance" ;; \
check|status) check_gov ;; esac
- [[ -n "${GOVERNOR}" ]] && throttle_gov
- shift "2"
+ [[ -n "${GOVERNOR}" ]] && throttle_gov; shift "2"
unset GOVERNOR
;;
gpu)
@@ -266,49 +258,31 @@ while (( "$#" )); do
cut|off|powersave|start) NVPM="0" ;; \
full|on|performance|stop) NVPM="1" ;; \
check|status) check_nvpm ;; esac
- [[ -n "${NVPM}" ]] && throttle_nvpm
- shift "2"
+ [[ -n "${NVPM}" ]] && throttle_nvpm; shift "2"
unset NVPM
;;
backlight)
[[ -z "${BACKLIGHT}" ]] && \
case "${2}" in \
- cut|off|0|powersave|start) BACKLIGHT="0" ;; \
- full|on|1|performance|stop) BACKLIGHT="1" ;; \
- 2) BACKLIGHT="2" ;; \
+ cut|off|powersave|start) BACKLIGHT="0" ;; \
+ full|on|performance|stop) BACKLIGHT="1" ;; \
check|status) check_backlight ;; esac
- [[ -n "${BACKLIGHT}" ]] && throttle_backlight
- shift "2"
+ [[ -n "${BACKLIGHT}" ]] && throttle_backlight; shift "2"
unset BACKLIGHT
;;
full|on|performance|start|cut|off|powersave|stop)
- case "${1}" in
- cut|off|powersave|start)
- [[ -f /etc/throttle.d/powersave ]] && . /etc/throttle.d/powersave || config_help; SYSTEM="1"
- ;;
- full|on|performance|stop)
- [[ -f /etc/throttle.d/performance ]] && . /etc/throttle.d/performance || config_help; SYSTEM="0"
- ;;
- esac
- throttle_ht
- throttle_gov
- throttle_turbo
- throttle_backlight
- throttle_nvpm
- throttle_system
- shift
+ case "${1}" in \
+ cut|off|powersave|start) \
+ [[ -f /etc/throttle.d/powersave ]] && . /etc/throttle.d/powersave || config_help; SYSTEM="1" ;; \
+ full|on|performance|stop) \
+ [[ -f /etc/throttle.d/performance ]] && . /etc/throttle.d/performance || config_help; SYSTEM="0" ;; esac
+ throttle_system; throttle_turbo; throttle_ht; throttle_gov; throttle_nvpm; throttle_backlight; shift
unset GOVERNOR XPSTURBO HYPERTHREADS ENERGYPERF BACKLIGHT LAPTOP DIRTYWBC NMIDOG \
- POLICY APM AAM CONTROL AUTOSUSPEND POWERSAVE CONTROLLER \
+ POLICY APM AAM CONTROL{,S} AUTOSUSPEND{,S} POWERSAVE CONTROLLER \
WLPOWERSAVE WOLA WOLB LEDBRIGHT NVPM SYSTEM
;;
check|status)
- check_ht
- check_gov
- check_turbo
- check_backlight
- check_nvpm
- check_system
- shift
+ check_system; check_turbo; check_ht; check_gov; check_nvpm; check_backlight; shift
;;
help|*)
throttle_help