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.