mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-31 12:10:52 -04:00
fix idle (arch, acpi and apm) and lockdep
OK, so 25-mm1 gave a lockdep error which made me look into this.
The first thing that I noticed was the horrible mess; the second thing I
saw was hacks like: 71e93d1561
The problem is that arch idle routines are somewhat inconsitent with
their IRQ state handling and instead of fixing _that_, we go paper over
the problem.
So the thing I've tried to do is set a standard for idle routines and
fix them all up to adhere to that. So the rules are:
idle routines are entered with IRQs disabled
idle routines will exit with IRQs enabled
Nearly all already did this in one form or another.
Merge the 32 and 64 bit bits so they no longer have different bugs.
As for the actual lockdep warning; __sti_mwait() did a plainly un-annotated
irq-enable.
Signed-off-by: Peter Zijlstra <[email protected]>
Tested-by: Bob Copeland <[email protected]>
Signed-off-by: Ingo Molnar <[email protected]>
This commit is contained in:
parent
c3bf9bc243
commit
7f424a8b08
6 changed files with 137 additions and 244 deletions
|
|
@ -418,13 +418,12 @@ static void acpi_processor_idle(void)
|
|||
|
||||
cx = pr->power.state;
|
||||
if (!cx || acpi_idle_suspend) {
|
||||
if (pm_idle_save)
|
||||
pm_idle_save();
|
||||
else
|
||||
if (pm_idle_save) {
|
||||
pm_idle_save(); /* enables IRQs */
|
||||
} else {
|
||||
acpi_safe_halt();
|
||||
|
||||
if (irqs_disabled())
|
||||
local_irq_enable();
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
|
@ -520,10 +519,12 @@ static void acpi_processor_idle(void)
|
|||
* Use the appropriate idle routine, the one that would
|
||||
* be used without acpi C-states.
|
||||
*/
|
||||
if (pm_idle_save)
|
||||
pm_idle_save();
|
||||
else
|
||||
if (pm_idle_save) {
|
||||
pm_idle_save(); /* enables IRQs */
|
||||
} else {
|
||||
acpi_safe_halt();
|
||||
local_irq_enable();
|
||||
}
|
||||
|
||||
/*
|
||||
* TBD: Can't get time duration while in C1, as resumes
|
||||
|
|
@ -534,8 +535,6 @@ static void acpi_processor_idle(void)
|
|||
* skew otherwise.
|
||||
*/
|
||||
sleep_ticks = 0xFFFFFFFF;
|
||||
if (irqs_disabled())
|
||||
local_irq_enable();
|
||||
|
||||
break;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue