Messages in this thread | | | Date | Mon, 3 Jan 2005 19:33:18 +0100 | From | Pavel Machek <> | Subject | Re: [PATCH] swsusp: properly suspend and resume *all* devices |
| |
On Po 03-01-05 18:08:07, Pavel Machek wrote: > Hi! > > > swsusp does not suspend and resume *all* devices, including system > > devices. This has been the case since at least 2.6.9, if not earlier. > > > > One effect of this is that resuming fails to properly reconfigure > > interrupt routers. In 2.6.9 this was obscured by other kernel code, > > but in 2.6.10 this often causes post-resume APIC errors and near-total > > failure of some PCI devices (e.g. network, sound and USB controllers). > > > > On at least one of my systems, without this patch I also have to "ifdown > > eth0;ifup eth0" to get networking to function after resuming, even after > > working around the interrupt routing problem mentioned above. With this > > patch, networking simply works after a resume, and the ifdown/ifup is > > no longer needed. > > > > This patch is against 2.6.10-mm1, although it applies with an offset to > > 2.6.10-bk4 as well. I have tested it against 2.6.10-mm1 and 2.6.10-bk4, > > with and without "noapic", with and without "acpi=off". However, I have > > not tested it on a highmem system. > > > > I believe this patch fixes a severe problem in swsusp; I would like to > > see this patch (or at least *some* kind of fix for this problem) tested > > more widely and committed to mainline before the 2.6.11 release. > > > > Signed-off-by: Barry K. Nathan <barryn@pobox.com> > > Ack. [I have similar patch in my tree, but yours is better in error > checking area. Please push it to akpm.]
Actually you missed second half: same code should be added around swsusp_arch_resume. It is not too critical there, but its right thing to do. Pavel
> > --- linux-2.6.10-mm1/kernel/power/swsusp.c 2005-01-03 02:16:15.175265255 -0800 > > +++ linux-2.6.10-mm1-bkn3/kernel/power/swsusp.c 2005-01-03 06:27:07.753344731 -0800 > > @@ -843,11 +843,22 @@ > > if ((error = arch_prepare_suspend())) > > return error; > > local_irq_disable(); > > + /* At this point, device_suspend() has been called, but *not* > > + * device_power_down(). We *must* device_power_down() now. > > + * Otherwise, drivers for some devices (e.g. interrupt controllers) > > + * become desynchronized with the actual state of the hardware > > + * at resume time, and evil weirdness ensues. > > + */ > > + if ((error = device_power_down(PM_SUSPEND_DISK))) { > > + local_irq_enable(); > > + return error; > > + } > > save_processor_state(); > > error = swsusp_arch_suspend(); > > /* Restore control flow magically appears here */ > > restore_processor_state(); > > restore_highmem(); > > + device_power_up(); > > local_irq_enable(); > > return error; > > } >
-- People were complaining that M$ turns users into beta-testers... ...jr ghea gurz vagb qrirybcref, naq gurl frrz gb yvxr vg gung jnl! - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |