Messages in this thread Patch in this message | | | From | "Rafael J. Wysocki" <> | Subject | Re: [bisected][bug] commit e978aa7d7d57d04eb5f88 breaks suspend on laptop. | Date | Sat, 12 Nov 2011 02:50:13 +0100 |
| |
On Saturday, November 12, 2011, Rafael J. Wysocki wrote: > On Friday, November 11, 2011, Tomas M. wrote: > > yes, that helps. > > What does "cat /sys/devices/system/cpu/cpuidle/current_driver" show?
If that's "acpi_idle", the appended patch should help (it works for me at least).
Thanks, Rafael
--- From: Rafael J. Wysocki <rjw@sisk.pl> Subject: ACPI / cpuidle: Remove acpi_idle_suspend (to fix suspend regression)
After commit e978aa7d7d57d04eb5f88a7507c4fb98577def77 (cpuidle: Move dev->last_residency update to driver enter routine; remove dev->last_state) setting acpi_idle_suspend to 1 by acpi_processor_suspend() causes the ACPI cpuidle routines to return error codes continuously, which in turn causes cpuidle to lock up (hard). However, acpi_idle_suspend doesn't appear to be useful for any purpose (it's racy and doesn't really provide any real protection), so it can be removed, which makes the problem go away.
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> --- drivers/acpi/processor_idle.c | 29 ----------------------------- 1 file changed, 29 deletions(-)
Index: linux/drivers/acpi/processor_idle.c =================================================================== --- linux.orig/drivers/acpi/processor_idle.c +++ linux/drivers/acpi/processor_idle.c @@ -224,7 +224,6 @@ static void lapic_timer_state_broadcast( /* * Suspend / resume control */ -static int acpi_idle_suspend; static u32 saved_bm_rld; static void acpi_idle_bm_rld_save(void) @@ -243,21 +242,13 @@ static void acpi_idle_bm_rld_restore(voi int acpi_processor_suspend(struct acpi_device * device, pm_message_t state) { - if (acpi_idle_suspend == 1) - return 0; - acpi_idle_bm_rld_save(); - acpi_idle_suspend = 1; return 0; } int acpi_processor_resume(struct acpi_device * device) { - if (acpi_idle_suspend == 0) - return 0; - acpi_idle_bm_rld_restore(); - acpi_idle_suspend = 0; return 0; } @@ -763,13 +754,6 @@ static int acpi_idle_enter_c1(struct cpu local_irq_disable(); - /* Do not access any ACPI IO ports in suspend path */ - if (acpi_idle_suspend) { - local_irq_enable(); - cpu_relax(); - return -EINVAL; - } - lapic_timer_state_broadcast(pr, cx, 1); kt1 = ktime_get_real(); acpi_idle_do_entry(cx); @@ -810,13 +794,6 @@ static int acpi_idle_enter_simple(struct local_irq_disable(); - if (acpi_idle_suspend) { - local_irq_enable(); - cpu_relax(); - return -EINVAL; - } - - if (cx->entry_method != ACPI_CSTATE_FFH) { current_thread_info()->status &= ~TS_POLLING; /* @@ -895,12 +872,6 @@ static int acpi_idle_enter_bm(struct cpu if (unlikely(!pr)) return -EINVAL; - - if (acpi_idle_suspend) { - cpu_relax(); - return -EINVAL; - } - if (!cx->bm_sts_skip && acpi_idle_bm_check()) { if (drv->safe_state_index >= 0) { return drv->states[drv->safe_state_index].enter(dev,
| |