Messages in this thread | | | Date | Sat, 12 Nov 2011 10:21:48 -0300 | From | "Tomas M." <> | Subject | Re: [bisected][bug] commit e978aa7d7d57d04eb5f88 breaks suspend on laptop. |
| |
Yes, it was acpi_idle, and the proposed patch fixed the problem.
On 11/11/2011 10:50 PM, Rafael J. Wysocki wrote: > 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,
| |