Skip to contentSkip to conversation

sleepy linux

RFC In review Pavel Machek 5 participants 26 messages Dec 25, 2007 – Jan 8, 2008

Subsystems (11)
lore
Share & tools
lore
#0 lore raw

RFC 1/1 sleepy linux

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 <[email protected]>
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)

arch/x86/kernel/process_32.c +1 -0
index 9663c2a..0f65aa9 100644
@@ -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);
 
drivers/input/input-polldev.c +1 -1
index 92b3598..83a8046 100644
@@ -151,7 +151,7 @@ int input_register_polled_device(struct 
 
 	INIT_DELAYED_WORK(&dev->work, input_polled_device_work);
 	if (!dev->poll_interval)
-		dev->poll_interval = 500;
+		dev->poll_interval = 50000;
 	input->private = dev;
 	input->open = input_open_polled_device;
 	input->close = input_close_polled_device;
drivers/input/input.c +9 -1
index 307c7b5..2deca60 100644
@@ -263,8 +263,14 @@ void input_event(struct input_dev *dev,
 {
 	unsigned long flags;
 
-	if (is_event_supported(type, dev->evbit, EV_MAX)) {
+	if ((type == EV_SW) && (code == SW_LID)) {
+		int is_closed = value;
+		printk("LID: %d\n", value);
+		if (is_closed) atomic_dec(&cpu_needed);
+		else atomic_inc(&cpu_needed);
+	}
 
+	if (is_event_supported(type, dev->evbit, EV_MAX)) {
 		spin_lock_irqsave(&dev->event_lock, flags);
 		add_input_randomness(type, code, value);
 		input_handle_event(dev, type, code, value);
@@ -1575,6 +1581,8 @@ static int __init input_init(void)
 		goto fail2;
 	}
 
+	/* FIXME: should only inc it if LID is open */
+	atomic_inc(&cpu_needed);
 	return 0;
 
  fail2:	input_proc_exit();
drivers/rtc/rtc-sysfs.c +0 -10
index 2ae0e83..ba5e806 100644
@@ -149,16 +149,6 @@ rtc_sysfs_set_wakealarm(struct device *d
 
 	alarm = simple_strtoul(buf, NULL, 0);
 	if (alarm > now) {
-		/* Avoid accidentally clobbering active alarms; we can't
-		 * entirely prevent that here, without even the minimal
-		 * locking from the /dev/rtcN api.
-		 */
-		retval = rtc_read_alarm(rtc, &alm);
-		if (retval < 0)
-			return retval;
-		if (alm.enabled)
-			return -EBUSY;
-
 		alm.enabled = 1;
 	} else {
 		alm.enabled = 0;
include/linux/pm.h +4 -0
index 09a309b..991af06 100644
@@ -246,6 +246,10 @@ #define device_init_wakeup(dev,val) \
 		device_set_wakeup_enable(dev,val); \
 	} while(0)
 
+void detect_idle(void);
+void enter_auto_sleep(void);
+extern atomic_t cpu_needed;
+
 #endif /* __KERNEL__ */
 
 #endif /* _LINUX_PM_H */
kernel/power/main.c +64 -0

94 lines not on this page · raw message

kernel/time/tick-sched.c +2 -2
index cb89fa8..456a662 100644
@@ -9,7 +9,7 @@
  *
  *  Started by: Thomas Gleixner and Ingo Molnar
  *
- *  For licencing details see kernel-base/COPYING
+ *  Distribute under GPLv2.
  */
 #include <linux/cpu.h>
 #include <linux/err.h>
@@ -502,7 +508,7 @@ #endif /* NO_HZ */
  */
 #ifdef CONFIG_HIGH_RES_TIMERS
 /*
- * We rearm the timer until we get disabled by the idle code
+ * We rearm the timer until we get disabled by the idle code.
  * Called with interrupts disabled and timer->base->cpu_base->lock held.
  */
 static enum hrtimer_restart tick_sched_timer(struct hrtimer *timer)
kernel/time/timer_list.c +81 -2

93 lines not on this page · raw message

kernel/time/timer_stats.c +1 -1
index c36bb7e..417da8c 100644
@@ -26,7 +26,7 @@
  * the pid and cmdline from the owner process if applicable.
  *
  * Start/stop data collection:
- * # echo 1[0] >/proc/timer_stats
+ * # echo [1|0] >/proc/timer_stats
  *
  * Display the information collected so far:
  * # cat /proc/timer_stats
kernel/workqueue.c +2 -0
index 52d5e7c..dc7f748 100644
@@ -220,6 +220,7 @@ int queue_delayed_work_on(int cpu, struc
 	struct timer_list *timer = &dwork->timer;
 	struct work_struct *work = &dwork->work;
 
+	timer_stats_timer_set_start_info(&dwork->timer);
 	if (!test_and_set_bit(WORK_STRUCT_PENDING, work_data_bits(work))) {
 		BUG_ON(timer_pending(timer));
 		BUG_ON(!list_empty(&work->entry));
@@ -581,6 +582,7 @@ EXPORT_SYMBOL(schedule_delayed_work);
 int schedule_delayed_work_on(int cpu,
 			struct delayed_work *dwork, unsigned long delay)
 {
+	timer_stats_timer_set_start_info(&dwork->timer);
 	return queue_delayed_work_on(cpu, keventd_wq, dwork, delay);
 }
 EXPORT_SYMBOL(schedule_delayed_work_on);
mm/slab.c +1 -1
index 2e338a5..8a5d988 100644
@@ -945,7 +945,7 @@ static void __cpuinit start_cpu_timer(in
 		init_reap_node(cpu);
 		INIT_DELAYED_WORK(reap_work, cache_reap);
 		schedule_delayed_work_on(cpu, reap_work,
-					__round_jiffies_relative(HZ, cpu));
+					 __round_jiffies_relative(HZ*10000, cpu)); /* FIXME !*/
 	}
 }
 
mm/vmstat.c +1 -1
index e8d846f..7fd3dbb 100644
@@ -794,7 +794,7 @@ #endif /* CONFIG_PROC_FS */
 
 #ifdef CONFIG_SMP
 static DEFINE_PER_CPU(struct delayed_work, vmstat_work);
-int sysctl_stat_interval __read_mostly = HZ;
+int sysctl_stat_interval __read_mostly = 10000 * HZ;
 
 static void vmstat_update(struct work_struct *w)
 {
Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#1 lore raw

Am Mittwoch, 26. Dezember 2007 00:07:31 schrieb Pavel Machek:

Quoted 7 lines

Heute 00:07:31

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?

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

#2 lore raw
Quoted 11 lines · Oliver Neukum

Am Mittwoch, 26. Dezember 2007 00:07:31 schrieb Pavel Machek:

Quoted 7 lines

Heute 00:07:31

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?

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.

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

Signature · 7 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
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/
#3 lore raw
In reply to Oliver Neukum
Quoted 11 lines · Oliver Neukum

Am Mittwoch, 26. Dezember 2007 00:07:31 schrieb Pavel Machek:

Quoted 7 lines

Heute 00:07:31

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?

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.

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

I guess I need to know from atomic context :-(.
Pavel

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#4 lore raw

Am Mittwoch, 26. Dezember 2007 21:17:22 schrieb Pavel Machek:

Quoted 7 lines · Oliver Neukum
Quoted 6 lines

Am Mittwoch, 26. Dezember 2007 00:07:31 schrieb Pavel Machek:

Quoted 5 lines

Heute 00:07:31

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.

Quoted 7 lines
Quoted 5 lines
Quoted 2 lines

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

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.

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

Do you really want to know whether they are suspended or whether they could be suspended?

Quoted 1 line

I guess I need to know from atomic context :-(.

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

Regards
Oliver

#5 lore raw
Quoted 11 lines · Oliver Neukum

Am Mittwoch, 26. Dezember 2007 21:17:22 schrieb Pavel Machek:

Quoted 10 lines · Oliver Neukum
Quoted 9 lines

Am Mittwoch, 26. Dezember 2007 00:07:31 schrieb Pavel Machek:

Quoted 7 lines

Heute 00:07:31

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?

Quoted 7 lines
Quoted 4 lines
Quoted 2 lines

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.

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

Do you really want to know whether they are suspended or whether they could be suspended?

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 system into s2ram...

Quoted 3 lines
Quoted 1 line

I guess I need to know from atomic context :-(.

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

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

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#6 lore raw

Am Mittwoch, 26. Dezember 2007 21:32:58 schrieb Pavel Machek:

Quoted 5 lines · Oliver Neukum
Quoted 4 lines

Am Mittwoch, 26. Dezember 2007 21:17:22 schrieb Pavel Machek:

Quoted 1 line

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

Quoted 8 lines
Quoted 2 lines

Do you really want to know whether they are suspended or whether they could be suspended?

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 system into s2ram...

Your calculation of cost/benefit will be wrong. A driver will have timeouts based on the cost of a suspend/resume cycle of that device only. You'd have to calculate of keeping the whole system awake against that.

Regards
Oliver

#7 lore raw

Hi!

Quoted 7 lines
Quoted 7 lines
Quoted 4 lines
Quoted 1 line

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

Do you really want to know whether they are suspended or whether they could be suspended?

If they are suspended.

Quoted 7 lines
Quoted 3 lines

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 system into s2ram...

Your calculation of cost/benefit will be wrong. A driver will have timeouts based on the cost of a suspend/resume cycle of that device only. You'd have to calculate of keeping the whole system awake against that.

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

Pavel

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#8 lore raw
In reply to Pavel Machek

Am Mittwoch, 26. Dezember 2007 21:32:58 schrieb Pavel Machek:

Quoted 2 lines

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

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. They would sensibly do only idle/busy detection.

Quoted 2 lines

And yes, I want device activity to prevent s2ram. If user is burning CD, machine should not sleep. If user is actively typing, machine

In these cases the devices involved should report themselves busy, shouldn't they?

Quoted 4 lines

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.

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

#9 lore raw

Hi!

Quoted 8 lines
Quoted 2 lines

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

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. They would sensibly do only idle/busy detection.

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 details ready).

Quoted 5 lines
Quoted 2 lines

And yes, I want device activity to prevent s2ram. If user is burning CD, machine should not sleep. If user is actively typing, machine

In these cases the devices involved should report themselves busy, shouldn't they?

Yes.

Quoted 8 lines
Quoted 4 lines

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.

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.

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

Pavel

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#10 lore raw

Am Sonntag, 30. Dezember 2007 00:51:34 schrieb Pavel Machek:

Quoted 11 lines

Hi!

Quoted 8 lines
Quoted 2 lines

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

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. They would sensibly do only idle/busy detection.

Quoted 4 lines

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 details ready).

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?

[..]

Quoted 6 lines
Quoted 3 lines

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.

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

This mainly means input devices.

Regards
Oliver

#11 lore raw
Quoted 17 lines · Oliver Neukum

Am Sonntag, 30. Dezember 2007 00:51:34 schrieb Pavel Machek:

Quoted 11 lines

Hi!

Quoted 8 lines
Quoted 2 lines

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

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. They would sensibly do only idle/busy detection.

Quoted 4 lines

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 details ready).

Quoted 6 lines

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?

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

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#12 lore raw

Am Montag, 31. Dezember 2007 15:44:47 schrieb Pavel Machek:

Quoted 9 lines · Oliver Neukum
Quoted 3 lines

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

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).

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

#13 lore raw
In reply to Pavel Machek
Quoted 9 lines · Pavel Machek

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?

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

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

#14 lore raw
Quoted 9 lines · H. Peter Anvin
Quoted 7 lines · Pavel Machek

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?
3) Network card that is either down
or can wake up system on any packet (and not loose too many packets)

Quoted 3 lines

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.

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

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#15 lore raw
Quoted 9 lines · Pavel Machek

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

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

#16 lore raw
In reply to H. Peter Anvin

Am Mittwoch, 26. Dezember 2007 19:56:59 schrieb H. Peter Anvin:

Quoted 7 lines
Quoted 3 lines

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

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.

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

#17 lore raw
Quoted 8 lines · Oliver Neukum

Am Mittwoch, 26. Dezember 2007 19:56:59 schrieb H. Peter Anvin:

Quoted 4 lines
Quoted 3 lines

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

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.

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

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

#18 lore raw
Quoted 8 lines · H. Peter Anvin
Quoted 7 lines · Oliver Neukum

Am Mittwoch, 26. Dezember 2007 19:56:59 schrieb H. Peter Anvin:

Quoted 6 lines
Quoted 3 lines

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

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.

Quoted 7 lines
Quoted 2 lines

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

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.

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

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#19 lore raw
Quoted 15 lines · Pavel Machek
Quoted 10 lines · H. Peter Anvin
Quoted 7 lines · Oliver Neukum

Am Mittwoch, 26. Dezember 2007 19:56:59 schrieb H. Peter Anvin:

Quoted 4 lines
Quoted 3 lines

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

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.

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

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.

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

Quoted 6 lines

S3 is ~1W.

That's quite significant difference.

(But yes, connected-to-ethernet is not most important use scenario.)
Pavel

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

#20 lore raw

Hi!

Quoted 5 lines
Quoted 5 lines

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

S3 is ~1W.

Quoted 7 lines
Quoted 4 lines

That's quite significant difference.

(But yes, connected-to-ethernet is not most important use scenario.)
Pavel

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.

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

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#21 lore raw
In reply to Pavel Machek

Hi,

Quoted 19 lines · ext Pavel Machek

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 <[email protected]>
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:

Quoted 3 lines

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

2) Compile this, then go to sleep

Why can't these cases be based on CPUIdle?

Quoted 1 line

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

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

- prevent too deep sleep states till the event happens

Quoted 5 lines

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.

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, it could be effectively replaced by some HW timer.

Quoted 4 lines

Requirements:

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

Quoted 8 lines

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)

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.

Signature · 4 lines
Cheers, Igor

Igor Stoppa <[email protected]>
(Nokia Multimedia - CP - OSSO / Helsinki, Finland)
#22 lore raw
In reply to Pavel Machek
Quoted 11 lines · Pavel Machek

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

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

#23 lore raw
Quoted 20 lines · Ingo Molnar
Quoted 11 lines · Pavel Machek

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

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.

Quoted 7 lines

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.

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

Quoted 1 line

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

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

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#24 lore raw
Quoted 11 lines · Pavel Machek
Quoted 8 lines

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.

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

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 to finish.

Quoted 5 lines
Quoted 1 line

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

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 :-(.

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

#25 lore raw

Hi!

Quoted 13 lines
Quoted 10 lines
Quoted 9 lines

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.

Quoted 2 lines

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

Quoted 6 lines

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 to finish.

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 that should be merged to Linus.

Quoted 10 lines
Quoted 5 lines
Quoted 1 line

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

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 :-(.

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.

I do not think TCP would survive "10 seconds sleep, 1 second up". But...

Quoted 3 lines

(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?)

...yes, we should probably play with the routers.

Quoted 2 lines

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

I expect to stress s2ram way too much ;-).
Pavel

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