[Pm-utils] [PATCH] userspace suspend (s2disk/s2ram) support

Stefan Seyfried seife at suse.de
Mon Oct 30 13:23:16 PST 2006


Hi,

this is my current implementation of userspace suspend support (with
automatic fallback if it is not available).
There is a second feature in there, around the $INHIBIT variable: it allows
a hook to prevent suspending. Right now i do this if i notice that the
currently running kernel is not available for resume (after a kernel update
but before the reboot, for example). If i know in advance that i will not
be able to resume, it does not make sense trying to suspend :-). Any hook
wanting to prevent suspend just has to "touch $INHIBIT" or "echo 'reason
why we cannot suspend' >> $INHIBIT".

Index: pm/functions
===================================================================
RCS file: /cvs/pm-utils/pm-utils/pm/functions,v
retrieving revision 1.26
diff -u -p -r1.26 functions
--- pm/functions	30 Oct 2006 15:40:42 -0000	1.26
+++ pm/functions	30 Oct 2006 21:20:36 -0000
@@ -4,9 +4,13 @@ export PATH=/sbin:/usr/sbin:/bin:/usr/bi
 
 # default values go here
 HIBERNATE_RESUME_POST_VIDEO=no
+HIBERNATE_METHOD=""
 SUSPEND_MODULES=""
 RESUME_MODULES=""
 PM_LOGFILE=${PM_LOGFILE:=/var/log/pm-suspend.log}
+INHIBIT=/var/run/pm-utils.inhibit
+S2DISK_BIN=/usr/sbin/s2disk
+S2DISK_CONF=/etc/suspend.conf
 
 [ -f /etc/pm/config ] && . /etc/pm/config
 
@@ -18,9 +22,13 @@ add_global() {
 
 # export them all here
 add_global HIBERNATE_RESUME_POST_VIDEO
+add_global HIBERNATE_METHOD
 add_global SUSPEND_MODULES
 add_global RESUME_MODULES
 add_global PM_LOGFILE
+add_global INHIBIT
+add_global S2DISK_BIN
+add_global S2DISK_CONF
 
 source_configs()
 {
@@ -113,6 +121,35 @@ get_power_status()
 	return $RETVAL
 }
 
+do_suspend()
+{
+	if [ -x /usr/sbin/s2ram ]; then
+		/usr/sbin/s2ram $S2RAM_OPTS
+	else
+		echo -n "mem" > /sys/power/state
+	fi
+}
+
+do_hibernate()
+{
+	if [ -z "$HIBERNATE_METHOD" ]; then
+		if [ -x $S2DISK_BIN -a -c /dev/snapshot ]; then
+			HIBERNATE_METHOD="userspace"
+		else
+			HIBERNATE_METHOD="kernel"
+		fi
+	fi
+	case $HIBERNATE_METHOD in
+		userspace)
+			$S2DISK_BIN -f $S2DISK_CONF
+			;;
+		kernel)
+			echo -n "platform" > /sys/power/disk
+			echo -n "disk" > /sys/power/state
+			;;
+	esac
+}
+
 pm_main()
 {
 	if [ -n "$PM_LOGFILE" ]; then
@@ -120,17 +157,23 @@ pm_main()
 		exec > "$PM_LOGFILE" 2>&1
 	fi
 	take_suspend_lock || exit 1
+
+	rm -f $INHIBIT
+
 	run_hooks "$1"
 	sync ; sync ; sync
 
 	case "$1" in
 		suspend)
-			pm-pmu --suspend || echo -n "mem" > /sys/power/state
+			if [ ! -e $INHIBIT ]; then
+				pm-pmu --suspend || do_suspend
+			fi
 			run_hooks resume reverse
 			;;
 		hibernate)
-			echo -n "platform" > /sys/power/disk
-			echo -n "disk" > /sys/power/state
+			if [ ! -e $INHIBIT ]; then
+				do_hibernate
+			fi
 			run_hooks thaw reverse
 			;;
 	esac
-- 
Stefan Seyfried
QA / R&D Team Mobile Devices        |              "Any ideas, John?"
SUSE LINUX Products GmbH, Nürnberg  | "Well, surrounding them's out." 


More information about the Pm-utils mailing list