Messages in this thread | | | Date | Sun, 28 May 2006 07:16:22 +0000 | From | Pavel Machek <> | Subject | Re: [PATCH] Longhaul - call suspend(PMSG_FREEZE) before and resume() after |
| |
Hi!
> I posted this to Dave Jones, but: > > This really should also get posted to linux-kernel, though I don't > > think people are going to be particularly enthusiastic about exposing > > these innards to modules. > So I'm posting this patch here too. I'm not subscribed to this list. > If You wish email me. > Minor change: preempt_disabled() goto_sleep_pci() and wakeup_pci() > causes "sheduling while atomic". So in this patch below it isn't > preempt_disabled(). But I think that this should be protected > in some way.
Well, suspend/resume is normally called during system suspend/resume, so it has 'interesting' locking requirements.
> How it works: > 1. Call suspend(PMSG_FREEZE) for each block device. > 2. Call suspend(PMSG_FREEZE) for each PCI device. > 3. Change CPU frequency. > 4. Call resume() for each PCI device. > 5. Call resume() for each block device. > > Result: No more broken DMA transfers caused by frequency change.
Result: system hang if userspace tries to do request at the same time -- PCI drivers probably were not designed for _that_... but we probably want to fix them, anyway, so this is probably ok (but expect to do some driver debugging).
But you should really add that preempt_disable and not try this on smp system... Pavel
-- Thanks for all the (sleeping) penguins. - 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/
| |