aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael J. Wysocki <rjw@sisk.pl>2012-09-03 19:45:50 -0400
committerRafael J. Wysocki <rjw@sisk.pl>2012-09-03 19:45:50 -0400
commit6bf9af464c4894e613567c0fb6559be67f31c88a (patch)
tree6b916ce4b69c50fd056344551bc2357836956935
parent5b41147ceae44350f43f9b8124687d22bed2bbb9 (diff)
parent66804c13f7b79fb26cf4848ebac1e865b9aff65c (diff)
Merge branch 'pm-cpuidle' into pm-shmobile
* pm-cpuidle: PM / cpuidle: Make ladder governor use the "disabled" state flag Honor state disabling in the cpuidle ladder governor
-rw-r--r--Documentation/cpuidle/sysfs.txt10
-rw-r--r--drivers/cpuidle/governors/ladder.c6
2 files changed, 14 insertions, 2 deletions
diff --git a/Documentation/cpuidle/sysfs.txt b/Documentation/cpuidle/sysfs.txt
index 9d28a3406e74..b6f44f490ed7 100644
--- a/Documentation/cpuidle/sysfs.txt
+++ b/Documentation/cpuidle/sysfs.txt
@@ -76,9 +76,17 @@ total 0
76 76
77 77
78* desc : Small description about the idle state (string) 78* desc : Small description about the idle state (string)
79* disable : Option to disable this idle state (bool) 79* disable : Option to disable this idle state (bool) -> see note below
80* latency : Latency to exit out of this idle state (in microseconds) 80* latency : Latency to exit out of this idle state (in microseconds)
81* name : Name of the idle state (string) 81* name : Name of the idle state (string)
82* power : Power consumed while in this idle state (in milliwatts) 82* power : Power consumed while in this idle state (in milliwatts)
83* time : Total time spent in this idle state (in microseconds) 83* time : Total time spent in this idle state (in microseconds)
84* usage : Number of times this state was entered (count) 84* usage : Number of times this state was entered (count)
85
86Note:
87The behavior and the effect of the disable variable depends on the
88implementation of a particular governor. In the ladder governor, for
89example, it is not coherent, i.e. if one is disabling a light state,
90then all deeper states are disabled as well, but the disable variable
91does not reflect it. Likewise, if one enables a deep state but a lighter
92state still is disabled, then this has no effect.
diff --git a/drivers/cpuidle/governors/ladder.c b/drivers/cpuidle/governors/ladder.c
index b6a09ea859b1..9b784051ec12 100644
--- a/drivers/cpuidle/governors/ladder.c
+++ b/drivers/cpuidle/governors/ladder.c
@@ -88,6 +88,8 @@ static int ladder_select_state(struct cpuidle_driver *drv,
88 88
89 /* consider promotion */ 89 /* consider promotion */
90 if (last_idx < drv->state_count - 1 && 90 if (last_idx < drv->state_count - 1 &&
91 !drv->states[last_idx + 1].disabled &&
92 !dev->states_usage[last_idx + 1].disable &&
91 last_residency > last_state->threshold.promotion_time && 93 last_residency > last_state->threshold.promotion_time &&
92 drv->states[last_idx + 1].exit_latency <= latency_req) { 94 drv->states[last_idx + 1].exit_latency <= latency_req) {
93 last_state->stats.promotion_count++; 95 last_state->stats.promotion_count++;
@@ -100,7 +102,9 @@ static int ladder_select_state(struct cpuidle_driver *drv,
100 102
101 /* consider demotion */ 103 /* consider demotion */
102 if (last_idx > CPUIDLE_DRIVER_STATE_START && 104 if (last_idx > CPUIDLE_DRIVER_STATE_START &&
103 drv->states[last_idx].exit_latency > latency_req) { 105 (drv->states[last_idx].disabled ||
106 dev->states_usage[last_idx].disable ||
107 drv->states[last_idx].exit_latency > latency_req)) {
104 int i; 108 int i;
105 109
106 for (i = last_idx - 1; i > CPUIDLE_DRIVER_STATE_START; i--) { 110 for (i = last_idx - 1; i > CPUIDLE_DRIVER_STATE_START; i--) {