[linux-pm] BISECTED: 2.6.29-rc2 regression: hibernation hang on eeepc-701

Rafael J. Wysocki rjw at sisk.pl
Thu Jan 22 14:05:25 PST 2009


On Thursday 22 January 2009, Alan Jenkins wrote:
> Rafael J. Wysocki wrote:
> > On Thursday 22 January 2009, Alan Jenkins wrote:
> >   
> >> Alan Jenkins wrote:
> >>     
> >>> Hibernation hangs just after writing the image.  With s2disk I can see
> >>> this from the console messages.  The same hang happens with kernel
> >>> swsusp ('echo disk | sudo tee /sys/power/state'), and I can see that
> >>> the image has been written from the HDD led.
> >>>
> >>> In either case, I can still hard-power-off and resume from hibernation.
> >>>
> >>> It doesn't hang if I use the shutdown method (either 'echo shutdown |
> >>> sudo tee /sys/power/disk' or  's2disk -P "shutdown method=shutdown"').
> >>>   
> >>>       
> >> I've bisected this to commit 571ff7584bb9e05fca0eb79752ae55a46faf3a98. 
> >> It doesn't revert cleanly from RC2.
> >>
> >> I think it's distinct from the other two reported suspend regressions. 
> >> I'm not using acpi-cpufreq, and the issue doesn't affect resume.
> >>     
> >
> > It looks distinct.
> >
> > Do you suspend this box to RAM and does it work?
> >   
> Yes, I do use STR on it occasionally, and it still works in RC2.
> 
> > Please retest with the appended patch applied.
> >   
> 
> That fixes it.

OK, it won't hurt to apply it.

Still, the hardware or the BIOS in your box seems to be broken, or both, so I'd
like to debug it a bit more if you don't mind.

Can you please test the patch below instead of the previous one?

Rafael

---
 drivers/pci/pci-driver.c |    5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

Index: linux-2.6/drivers/pci/pci-driver.c
===================================================================
--- linux-2.6.orig/drivers/pci/pci-driver.c
+++ linux-2.6/drivers/pci/pci-driver.c
@@ -660,7 +660,10 @@ static int pci_pm_poweroff(struct device
 	if (pci_has_legacy_pm_support(pci_dev))
 		return pci_legacy_suspend(dev, PMSG_HIBERNATE);
 
-	if (drv && drv->pm && drv->pm->poweroff) {
+	if (!drv || !drv->pm)
+		return pci_set_power_state(dev, PCI_D3hot);
+
+	if (drv->pm->poweroff) {
 		error = drv->pm->poweroff(dev);
 		suspend_report_result(drv->pm->poweroff, error);
 	}



More information about the linux-pm mailing list