aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/processor_idle.c
diff options
context:
space:
mode:
authorVenkatesh Pallipadi <venkatesh.pallipadi@intel.com>2007-06-15 19:36:00 -0400
committerLen Brown <len.brown@intel.com>2007-06-23 10:57:28 -0400
commitd5a3d32a042126f65a008e0e5204ef92ad2ee55d (patch)
tree8ecc0c8d5d1d658d570afd0b60760c1da8672b72 /drivers/acpi/processor_idle.c
parent83dd4504456d4b5e464d6ec4a7665e2c922db67f (diff)
ACPI: fix 2.6.20 SMP boot regression
Always disable/enable interrupts in the acpi idle routine, even in the error path. This is required as the 2.6.20 change in git commit d331e739f5ad2aaa9... "Fix interrupt race in idle callback" expects the idle handler to enable interrupt before returning. There was a case in acpi idle routine, in which interrupt was not being enabled before return, which caused the system to hang at bootup, while enabling C-states on an SMP system. The signature of the hang was that "processor.nocst" was required to enable boot. Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/processor_idle.c')
-rw-r--r--drivers/acpi/processor_idle.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c
index ee5759bef945..80ffc7829916 100644
--- a/drivers/acpi/processor_idle.c
+++ b/drivers/acpi/processor_idle.c
@@ -332,16 +332,18 @@ static void acpi_processor_idle(void)
332 int sleep_ticks = 0; 332 int sleep_ticks = 0;
333 u32 t1, t2 = 0; 333 u32 t1, t2 = 0;
334 334
335 pr = processors[smp_processor_id()];
336 if (!pr)
337 return;
338
339 /* 335 /*
340 * Interrupts must be disabled during bus mastering calculations and 336 * Interrupts must be disabled during bus mastering calculations and
341 * for C2/C3 transitions. 337 * for C2/C3 transitions.
342 */ 338 */
343 local_irq_disable(); 339 local_irq_disable();
344 340
341 pr = processors[smp_processor_id()];
342 if (!pr) {
343 local_irq_enable();
344 return;
345 }
346
345 /* 347 /*
346 * Check whether we truly need to go idle, or should 348 * Check whether we truly need to go idle, or should
347 * reschedule: 349 * reschedule: