diff options
| author | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2015-02-26 18:39:21 -0500 |
|---|---|---|
| committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2015-02-28 17:46:24 -0500 |
| commit | 01e04f466e12e883907937eb04a9010533363f55 (patch) | |
| tree | 3c10e3c6c051d508bdf655d5e06162b328ffe7cf /kernel/sched | |
| parent | c517d838eb7d07bbe9507871fab3931deccff539 (diff) | |
idle / sleep: Avoid excessive disabling and enabling interrupts
Disabling interrupts at the end of cpuidle_enter_freeze() is not
useful, because its caller, cpuidle_idle_call(), re-enables them
right away after invoking it.
To avoid that unnecessary back and forth dance with interrupts,
make cpuidle_enter_freeze() enable interrupts after calling
enter_freeze_proper() and drop the local_irq_disable() at its
end, so that all of the code paths in it end up with interrupts
enabled. Then, cpuidle_idle_call() will not need to re-enable
interrupts after calling cpuidle_enter_freeze() any more, because
the latter will return with interrupts enabled, in analogy with
cpuidle_enter().
Reported-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Diffstat (limited to 'kernel/sched')
| -rw-r--r-- | kernel/sched/idle.c | 1 |
1 files changed, 0 insertions, 1 deletions
diff --git a/kernel/sched/idle.c b/kernel/sched/idle.c index 94b2d7b88a27..f59198bda1bf 100644 --- a/kernel/sched/idle.c +++ b/kernel/sched/idle.c | |||
| @@ -116,7 +116,6 @@ static void cpuidle_idle_call(void) | |||
| 116 | */ | 116 | */ |
| 117 | if (idle_should_freeze()) { | 117 | if (idle_should_freeze()) { |
| 118 | cpuidle_enter_freeze(); | 118 | cpuidle_enter_freeze(); |
| 119 | local_irq_enable(); | ||
| 120 | goto exit_idle; | 119 | goto exit_idle; |
| 121 | } | 120 | } |
| 122 | 121 | ||
