[linux-pm] [PATCH 2/2] Fix console handling during suspend/resume

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On Fri, 16 Jun 2006, Benjamin Herrenschmidt wrote:
> 
> Ok, but I still have a hard time figuring out what you call by "save"
> then... 

Well, I think X and fbcon are examples of where you do actually save 
state, totally separately from the "suspend" thing, and where saving it at 
boot time is obviously not practical.

The same is true of any virtual devices.

But perhaps even more importantly, I think it's a _lot_ easier for most 
device driver writers to have an explicit save event, especially since 
this will be conditional on the configuration having CONFIG_PM.

And I think it's better to make things explicit for driver writers than 
expect them to get it right implicitly. Especially since in many cases the 
state you want to restore ends up depending on a lot of other things, it's 
often just _easier_ to have a "save state" phase that the driver writer 
knows is called before suspend, and which can (for example), just blindly 
save off the config space, and then at resume time we just blast it back 
out.

Same goes for just saving/restoring some firmware memory area or similar, 
for example. Yeah, we could ask user space to do it for us, but wouldn't 
it be nice if "it just worked", and we made the interfaces obvious enough 
that it's easy for a writer to make it so?

In contrast, keeping track of things one field at a time is actually 
pretty painful, even if you do have all the information, and even if you 
don't strictly need to save off what ends up being just another way of 
saying the same thing..

> I tend to think we are close to my concept of "prepare for suspend" that
> I exlained separately.

And, btw, I think "prepare_for_suspend()" is a perfectly fine alternate 
name for "save_state". Maybe even better. I don't at all disagree about 
that approach or the naming.

> I'm still not sure I totally understand what save_state exactly _is_ in
> your view of things since most of the time there is either no state to
> "save" or it makes no sense to save stuff that will get invalidated and
> need to be reconstructed as you properly explained...

Basically, outside of power management, there is a lot of state that 
simply doesn't need to _ever_ be saved, exactly because we don't actually 
lose that state.

So I would want us to have an explicit callback to save any potential 
state and just generally tell the driver to perhaps disconnect from any 
user-level stuff etc, rather than have the driver have to keep track of 
and remember that on its own.

But yes, if you think it would be more obvious to call it 
"prepare_for_suspend", I have no problem with that. It doesn't change the 
basic functionality.

I would want most devices to be able to have a suspend function that 
_literally_ just does

	pcibios_enable_device(dev, PCI_D0);

and it would be clear that interrupts have long since been disabled, and 
there can be no memory allocations, and by then "printk()" won't actually 
show anything at all, and you cannot return an error, because we have long 
since passed the point of no return.

THAT is what I care about. The current setup actually works for me, but it 
works at least partially exactly because I basically shut off the console 
"too early". I would really have preferred to shut off the console much 
much later, but since currently all the preparatory work actually also 
ends up shutting things down, that simply isn't an issue.

So for any individual driver, the split into "prepare" and "suspend" will 
never help. That's not the point. The point is purely that we can do 
general and global things in _between_ the point where "all drivers are 
prepared and have said that they are ready to suspend", and the final "go 
go go" moment.

I suspect a lot of drivers don't even need much of a prepare. And others 
will _literally_ just do something simple and stupid like

	static int prepare_to_suspend(struct pci_dev *dev, pm_message_t state)
	{
		pci_power_t pstate = pci_choose_state(pdev, state);

		if (state != PCI_D3hot && state != PCI_D3cold)
			return -EINVAL;
		.. allocate save area for IO registers, save them there ..
		pci_save_state(dev);
		return 0;
	}

exactly so that we can tell _ahead_ of time if something would fail, and 
so that we can keep the console open longer.

In my crazier moments, I actually want to do _three_ phases: my really 
preferred thing would be

 - phase 1: allocate memory, save state, and return errors

   After phase 1, we are guaranteed to not need any more memory 
   allocations.

 - phase 2: send commands to flush write caches, spin down

   After phase 2, we know we don't have to wait any more, and this is the 
   point where we disable the console and disable all interrupts

 - phase 3: actually power down chips.

   There is no "after phase 3". The CPU powering down was the last part.

but I'm still busy trying to just push for a second phase, so I'm not even 
going to mention that next crazy plan to you.

Oops.

		Linus


[Index of Archives]     [Linux ACPI]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [CPU Freq]     [Kernel Newbies]     [Fedora Kernel]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux