Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

cpupower: Enable disabled Cstates if they are below max latency

cpupower idle-set -D <latency>
currently only disables all C-states that have a higher latency than the
specified <latency>. But if deep sleep states were already disabled and
have a lower latency, they should get enabled again.

For example:
This call:
cpupower idle-set -D 30
disables all C-states with a higher or equal latency than 30.
If one then calls:
cpupower idle-set -D 100
C-states with a latency between 30-99 will get enabled again with this patch
now. It is ensured that only C-states with a latency of 100 and higher are
disabled.

Signed-off-by: Thomas Renninger <trenn@suse.de>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

authored by

Thomas Renninger and committed by
Rafael J. Wysocki
19c9fb89 64520947

+16 -5
+3 -1
tools/power/cpupower/man/cpupower-idle-set.1
··· 20 20 Enable a specific processor sleep state. 21 21 .TP 22 22 \fB\-D\fR \fB\-\-disable-by-latency\fR <LATENCY> 23 - Disable all idle states with a equal or higher latency than <LATENCY> 23 + Disable all idle states with a equal or higher latency than <LATENCY>. 24 + 25 + Enable all idle states with a latency lower than <LATENCY>. 24 26 .TP 25 27 \fB\-E\fR \fB\-\-enable-all\fR 26 28 Enable all idle states if not enabled already.
+13 -4
tools/power/cpupower/utils/cpuidle-set.c
··· 148 148 (cpu, idlestate); 149 149 state_latency = sysfs_get_idlestate_latency 150 150 (cpu, idlestate); 151 - if (disabled == 1 || latency > state_latency) 151 + if (disabled == 1) { 152 + if (latency > state_latency){ 153 + ret = sysfs_idlestate_disable 154 + (cpu, idlestate, 0); 155 + if (ret == 0) 156 + printf(_("Idlestate %u enabled on CPU %u\n"), idlestate, cpu); 157 + } 152 158 continue; 153 - ret = sysfs_idlestate_disable 154 - (cpu, idlestate, 1); 155 - if (ret == 0) 159 + } 160 + if (latency <= state_latency){ 161 + ret = sysfs_idlestate_disable 162 + (cpu, idlestate, 1); 163 + if (ret == 0) 156 164 printf(_("Idlestate %u disabled on CPU %u\n"), idlestate, cpu); 165 + } 157 166 } 158 167 break; 159 168 case 'E':