aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/sched/idle.c
diff options
context:
space:
mode:
authorJacob Pan <jacob.jun.pan@linux.intel.com>2016-11-29 02:03:04 -0500
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2016-11-29 08:02:21 -0500
commitbb8313b603eb8fd52de48a079bfcd72dcab2ef1e (patch)
tree909fb13b3c68408b772568d2e1be11fb99d5e2cb /kernel/sched/idle.c
parented61390bff3ad43166a2552651b09ebd95dd1da5 (diff)
cpuidle: Allow enforcing deepest idle state selection
When idle injection is used to cap power, we need to override the governor's choice of idle states. For this reason, make it possible the deepest idle state selection to be enforced by setting a flag on a given CPU to achieve the maximum potential power draw reduction. Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com> [ rjw: Subject & changelog ] Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'kernel/sched/idle.c')
-rw-r--r--kernel/sched/idle.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/kernel/sched/idle.c b/kernel/sched/idle.c
index 1d8718d5300d..513e4dfeeae7 100644
--- a/kernel/sched/idle.c
+++ b/kernel/sched/idle.c
@@ -164,11 +164,14 @@ static void cpuidle_idle_call(void)
164 * timekeeping to prevent timer interrupts from kicking us out of idle 164 * timekeeping to prevent timer interrupts from kicking us out of idle
165 * until a proper wakeup interrupt happens. 165 * until a proper wakeup interrupt happens.
166 */ 166 */
167 if (idle_should_freeze()) { 167
168 entered_state = cpuidle_enter_freeze(drv, dev); 168 if (idle_should_freeze() || dev->use_deepest_state) {
169 if (entered_state > 0) { 169 if (idle_should_freeze()) {
170 local_irq_enable(); 170 entered_state = cpuidle_enter_freeze(drv, dev);
171 goto exit_idle; 171 if (entered_state > 0) {
172 local_irq_enable();
173 goto exit_idle;
174 }
172 } 175 }
173 176
174 next_state = cpuidle_find_deepest_state(drv, dev); 177 next_state = cpuidle_find_deepest_state(drv, dev);