Rafael, On Thu, 2007-09-20 at 23:45 +0200, Rafael J. Wysocki wrote: > > We disable everything in device_suspend() > > No, we don't. sysdevs are _not_ suspended in device_suspend(). > They are suspended in device_power_down(), which is called > _after_ disable_nonboot_cpus() (from swsusp_suspend()). > > > including timekeeping, > > No, the timekeeping is suspended in device_power_down() (or at least it should > be).
Damn, you are right. Reading through 30 different logs confused me. > > enable_nonboot_cpus(); > > Actually, we can't do this here, because of ACPI and some interrupt handling > related problems. Unfortunately, platform_finish() needs to go _after_ > enable_nonboot_cpus() and device_resume() needs to go after platform_finish(). > Analogously, disable_nonboot_cpus() has to go after platform_prepare(). > > Otherwise, some systems will break. Well, I don't buy this one. The system would break in the same way, when I take CPU#1 offline before I initiate the suspend. > > and non-surprisingly the "my VAIO needs help from keyboard" problem went > > away immediately. See patch below. (on top of rc7-hrt1, -mm1 does not > > work at all on my VAIO due to some yet not identified wreckage) > > Hm, I really don't know why it helps, but that's not because of the > timekeeping > suspend, IMO. It is related. We rely on some subtle thing which is not up when we resume the non boot cpu. > > I did not yet look into the suspend to ram code, but I guess that there > > is an equivalent problem. > > Yes, the code ordering is the same, but it's not totally wrong, IMHO. > > > But I have no idea why this affects Andrews jinxed VAIO (UP machine), > > though I suspect that we have more timekeeping/timer depending code > > somewhere waiting to bite us. > > That's possible. > > > Also I still need to debug why the HIBERNATION_TEST code path (which has > > a msleep(5000) in it) does not fail, > > See above. :-) Yes. It makes sense. When I change the TEST code path to: - printk("swsusp debug: Waiting for 5 seconds.\n"); - msleep(5000); + printk("swsusp debug: before swsusp_suspend\n"); + error = swsusp_suspend(); then I have the same effect as I get from real hibernation. And we actually shut down time keeping somewhere in that code path. ACPI: PCI interrupt for device 0000:00:1b.0 disabled swsusp debug: before swsusp_suspend Suspend timekeeping swsusp: critical section: swsusp: Need to copy 112429 pages swsusp: Normal pages needed: 35399 + 1024 + 40, available pages: 193876 swsusp: critical section: done (112429 pages copied) Intel machine check architecture supported. Intel machine check reporting enabled on CPU#0. Resume timekeeping ACPI: PCI Interrupt 0000:00:02.0[A] -> GSI 16 (level, low) -> IRQ 16 -> works fine This is with my patch applied. Without that I get: CPU1 is down swsusp debug: before swsusp_suspend Suspend timekeeping swsusp: critical section: swsusp: Need to copy 112429 pages swsusp: Normal pages needed: 35399 + 1024 + 40, available pages: 193876 swsusp: critical section: done (112429 pages copied) Intel machine check architecture supported. Intel machine check reporting enabled on CPU#0. Resume timekeeping Enabling non-boot CPUs --> Waits for ever until a key is pressed Thanks, tglx - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/