Re: [RFC] sleepy linux

Previous thread: Re: [PATCH] AMD Thermal Interrupt Support by Andrew Morton on Tuesday, December 25, 2007 - 3:04 pm. (27 messages)

Next thread: [PATCH][DOC] Console is utf-8 by default by Samuel Thibault on Tuesday, December 25, 2007 - 4:11 pm. (3 messages)
From: Pavel Machek
Date: Tuesday, December 25, 2007 - 4:07 pm

This is RFC. It does not even work for me... it sleeps but it will not
wake up, because SATA wakeup code is missing. Code attached for illustration.

I wonder if this is the right approach? What is right interface to the
drivers?


		Sleepy Linux
		~~~~~~~~~~~~

Copyright 2007 Pavel Machek <pavel@suse.cz>
	  GPLv2

Current Linux versions can enter suspend-to-RAM just fine, but only
can do it on explicit request. But suspend-to-RAM is important, eating
something like 10% of power needed for idle system. Starting suspend
manually is not too convinient; it is not an option on multiuser
machine, and even on single user machine, some things are not easy:

1) Download this big chunk in mozilla, then go to sleep

2) Compile this, then go to sleep

3) You can sleep now, but wake me up in 8:30 with mp3 player

Todays hardware is mostly capable of doing better: with correctly set
up wakeups, machine can sleep and successfully pretend it is not
sleeping -- by waking up whenever something interesting happens. Of
course, it is easier on machines not connected to the network, and on
notebook computers.

Requirements:

0) Working suspend-to-RAM, with kernel being able to bring video back.

1) RTC clock that can wake up system

2) Lid that can wake up a system,
   or keyboard that can wake up system and does not loose keypress
   or special screensaver setup

3) Network card that is either down
   or can wake up system on any packet (and not loose too many packets)



diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c
index 9663c2a..0f65aa9 100644
--- a/arch/x86/kernel/process_32.c
+++ b/arch/x86/kernel/process_32.c
@@ -178,6 +178,7 @@ void cpu_idle(void)
 	/* endless idle loop with no priority at all */
 	while (1) {
 		tick_nohz_stop_sched_tick();
+		detect_idle();
 		while (!need_resched()) {
 			void (*idle)(void);
 
diff --git a/drivers/input/input-polldev.c b/drivers/input/input-polldev.c
index 92b3598..83a8046 100644
--- ...
From: Oliver Neukum
Date: Wednesday, December 26, 2007 - 10:28 am

IMHO you are making to many special cases. The system can be "sleepy"
if all devices can be runtime suspended and all CPUs are idle.

	Regards
		Oliver

--

From: Pavel Machek
Date: Wednesday, December 26, 2007 - 12:02 pm

Pretty much, except that "timer device" needs to be runtime suspended,
too... We probably should not sleep if wakeup is scheduled 1 second in
future.

								Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--

From: Pavel Machek
Date: Wednesday, December 26, 2007 - 1:17 pm

Is there an easy way to tell if all the devices are runtime suspended?

I guess I need to know from atomic context :-(.
									Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--

From: Oliver Neukum
Date: Wednesday, December 26, 2007 - 1:23 pm

Do you really want to know whether they are suspended or whether they

Urgh. suspend() must be able to sleep and can fail.

	Regards
		Oliver
--

From: Pavel Machek
Date: Wednesday, December 26, 2007 - 1:32 pm

If they are suspended.

My plan is: let the drivers autosuspend on their own. If I see all of
them are autosuspended, then it looks like great time to put whole

That's ok.

... I also don't need to call any suspend() routines, because all the
drivers are already suspended, right?

And yes, I want device activity to prevent s2ram. If user is burning
CD, machine should not sleep. If user is actively typing, machine
should not sleep. My vision is: screen saver tells kernel keyboard
need not be very responsive, at that point keyboard driver can
autosuspend the keyboard, and if that was the last device, whole
system sleeps.
									Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--

From: Pavel Machek
Date: Saturday, December 29, 2007 - 4:48 pm

Hmm, right. Driver probably should have chance to autosuspend but tell
the core that whole system probably should not sleep... Hmm....

								Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--

From: Oliver Neukum
Date: Thursday, December 27, 2007 - 2:41 am

Well, you have a number of devices which cannot do runtime pm.
They can do suspend/resume with the whole system. For them these
operations mean saving/restoring state.
So for these devices implementing autosuspend makes no sense.

In these cases the devices involved should report themselves busy,

We lack a notion of telling devices that they are opened only for
detecting wakeups. Currently a driver has to assume that an opened
device has to be fully functional.

	Regards
		Oliver
--

From: Pavel Machek
Date: Saturday, December 29, 2007 - 4:51 pm

Yep... Let's call busy/idle detection and save/restore state
"autosuspend" for those devices. It does not save any power, but it
can be viewed as "kind-of-suspend". (No, I do not have this kind of


Yes, we'll need to add some userland interfaces. No, this will not be
easy.

									Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--

From: Oliver Neukum
Date: Sunday, December 30, 2007 - 9:39 am

Well, you probably would have to walk through all devices and check
all devices are either suspended or can be suspended. That would mean
struct device has to be extended to show common attributes.

But what's wrong with calling suspend() the conventional way once you've
decided to go into sleepy mode?


This mainly means input devices.

	Regards
		Oliver
--

From: Pavel Machek
Date: Monday, December 31, 2007 - 7:44 am

I'm not sure if it can be done in non-racy way. It is different from
"conventional" suspend(): you can still have userland requests after
this suspend(), and you should abort auto-sleep if you get one. (As
opposed to blocking in system suspend case).
								Pavel

-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--

From: Oliver Neukum
Date: Wednesday, January 2, 2008 - 3:52 am

But we are always racing against hardware in these cases.

Strictly speaking you cannot have pure userland request. If no task
is runnable and no timer about to fire any activity will require kernel
activity unless you are doing direct hardware access from user space
which in the generic case precludes suspension anyway.

	Regards
		Oliver
--

From: H. Peter Anvin
Date: Wednesday, December 26, 2007 - 11:56 am

This is the big crux I see.  You're going to constantly wake up the 
machine due to broadcast packets, and spend a lot of power just going in 
and out of S3.

	-hpa
--

From: Pavel Machek
Date: Wednesday, December 26, 2007 - 12:00 pm

Yep... for the first version, I'll be very happy if it autosleeps when
I'm traveling by bus or something. Working with ethernet plugged in is
quite a distant goal.

(But I guess some cleverness could be done on the router or
something. Automagically converting "interesting" packets into WoL
enabled ones, or...?)
									Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--

From: H. Peter Anvin
Date: Wednesday, December 26, 2007 - 12:22 pm

You've just eliminated 90%+ of the available Ethernet infrastructure.

However, there may be Ethernet controllers which can do something smart 
with incoming packets, and perhaps more importantly, we can always write 
a spec and try to push it to Intel, Broadcom, Realtek and Nvidia.

	-hpa
--

From: Oliver Neukum
Date: Wednesday, December 26, 2007 - 1:08 pm

How many machines care a lot about saving power while they are connected
to an ethernet? Wlan might be more of a problem.

	Regards
		Oliver

--

From: H. Peter Anvin
Date: Wednesday, December 26, 2007 - 1:43 pm

A lot of them should.  An inordinate amount of machines sit there 
burning power for no reason.  You can argue that S3 isn't needed -- that 
nohz + C3/C4 + turning off the screen would be enough, and that might be 
legit.  Heck, I'm constantly frustrated by every distro upgrade breaking 
power management for my monitor.

	-hpa
--

From: Pavel Machek
Date: Wednesday, December 26, 2007 - 1:51 pm

NOHZ + C4 + turn off screen + turn off disk + turn off SATA is still
~8W on thinkpad x60.

S3 is ~1W.

That's quite significant difference.

(But yes, connected-to-ethernet is not most important use scenario.)
								Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--

From: H. Peter Anvin
Date: Wednesday, December 26, 2007 - 1:54 pm

Still... if we could get the desktops of the world down anywhere close 
to that range when not used, it would be a huge win.

	-hpa
--

From: Pavel Machek
Date: Saturday, December 29, 2007 - 4:44 pm

Plus, it is probably mandatory if you want EnergyStar logo ...
								Pavel

-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--

From: Igor Stoppa
Date: Wednesday, December 26, 2007 - 1:09 pm

Hi,


This is about setting up properly the wakeup sources which means:

- the wakeup source is really capable of generating wakeups for the
target idle state

- the wakeup source is not actually capable of genrating wakeups from
the target idle state, which can be solved in 2 ways:

	- if the duration of the activity is known, set up an alarm 
	  (assuming alarms are proper wakeup sources) so that the
	   system is ready just in time, in a less efficient but more
	   responsive power saving state

	- if the duration of the activity is unknown choose the more 
	  efficient amongst the following solutions:

		- go to deep sleep state and periodically wakeup and
		  poll, with a period compatible with the timing 
		  of the event source


It might be that some hw doesn't provide deep power saving state for
some devices, but if the only missing feature is the wakeup capability,

These are just few system specific case, but if you start including USB
devices, the situation is going to get quite complicated very soon, if
you explicitly include certain HW devices in your model.


-- 
Cheers, Igor

Igor Stoppa <igor.stoppa@nokia.com>
(Nokia Multimedia - CP - OSSO / Helsinki, Finland)
--

From: Ingo Molnar
Date: Sunday, December 30, 2007 - 4:15 am

very nice approach! It might require smarter hardware to be really 
efficient, but the generic ability for Linux to utilize S3 automatically 
would _quickly_ drive the creation of smarter hardware i'm sure - so i'd 
propose to include this even if it wastes power in some cases.

a quick feature request: could you please make the wake-on-RTC 
capability generic and add a CONFIG_DEBUG_SUSPEND_ON_RAM=y config option 
(disabled by default) that does a short 1-second suspend-to-RAM sequence 
upon bootup? That way we could test s2ram automatically (which is a MUCH 
needed feature for automated regression testing and automatic 
bisection). In addition, some sort of 'suspend for N seconds' /sys or 
/dev/rtc capability would be nice as well.

btw., how far are you from having a working prototype?

	Ingo
--

From: Pavel Machek
Date: Saturday, January 5, 2008 - 2:51 pm

Hmm, are you sure it is good idea to do this from kernel? I guess this

SCSI/SATA issues stop me just now, but even if I get that to work, it
will be extremely disgusting hack... and it is unclear how to do it
nicely :-(.
									Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--

From: Ingo Molnar
Date: Tuesday, January 8, 2008 - 9:37 am

i have this low-prio effort to make all self-checks automatically 
available via 'make randconfig' as well, for all features that have no 
natural exposure during normal bootup. So far we've got rcutorture, 
kprobes-check, locking/lockdep-self-test and a handful of others. 
External scripts tend to go out of sync and LTP takes way too much time 

as long as the sleep periods are within say 10-20 seconds, and our s2ram 
cycle is fast and optimal enough, we could do this with networking 
enabled too, without dropping/stalling TCP connections left and right.

(Perhaps if we could notify routers that they should batch packets for N 
seconds and we could turn off PHY during that time, it would be even 
nicer - is there any such router extension in existence?)

but if it's nothing else but a s2ram debug/stress utility, that alone 
would be great too :-)

	Ingo
--

From: Pavel Machek
Date: Tuesday, January 8, 2008 - 12:15 pm

Well, I can give you a three liner, and if it stops working, I'll
treat is as a regression, because userland ABI changed...?

Or you can get about 10 lines of C, no problem, but I do not think



 I expect to stress s2ram way too much ;-).
									Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--

Previous thread: Re: [PATCH] AMD Thermal Interrupt Support by Andrew Morton on Tuesday, December 25, 2007 - 3:04 pm. (27 messages)

Next thread: [PATCH][DOC] Console is utf-8 by default by Samuel Thibault on Tuesday, December 25, 2007 - 4:11 pm. (3 messages)