[Pm-utils] Some thoughts about some of the hooks
Tim Dijkstra
newsuser at famdijkstra.org
Fri Oct 6 12:40:38 PDT 2006
On Fri, 6 Oct 2006 11:39:13 +0200
Stefan Seyfried <seife at suse.de> wrote:
> On Fri, Oct 06, 2006 at 10:01:19AM +0200, Tim Dijkstra wrote:
> > On Fri, 6 Oct 2006 07:56:11 +0200
> > Stefan Seyfried <seife at suse.de> wrote:
> >
> > > Ok. I am going to try to move all our powersaved scripts to pm-utils,
> > > and making it work with uswsusp (which is our default now) would have
> > > been one of the tasks anyway :-)
> >
> > Very good. Takes something from my todo list;)
>
> how about this:
>
> Index: functions
> ===================================================================
> RCS file: /cvs/pm-utils/pm-utils/pm/functions,v
> retrieving revision 1.20
> diff -u -p -r1.20 functions
> --- functions 28 Sep 2006 21:25:36 -0000 1.20
> +++ functions 6 Oct 2006 09:27:49 -0000
> @@ -96,14 +102,32 @@ pm_main()
> run_hooks "$1"
> sync ; sync ; sync
>
> + [ -e /etc/pm/config.d/$1 ] && . /etc/pm/config.d/$1
> +
> case "$1" in
> suspend)
> pm-pmu --suspend || echo -n "mem" > /sys/power/state
> run_hooks resume reverse
> ;;
> hibernate)
> - echo -n "platform" > /sys/power/disk
> - echo -n "disk" > /sys/power/state
> + if [ -z "$HIBERNATE" ]; then
> + if [ -x /usr/sbin/s2disk -a -c /dev/snapshot ]; then
> + HIBERNATE="userspace"
> + else
> + HIBERNATE="kernel"
> + fi
> + fi
> + if checkhibernate; then
> + case $HIBERNATE in
> + userspace)
> + /usr/sbin/s2disk -f /var/lib/s2disk.conf
> + ;;
> + kernel)
Also the VT switching is only necessary for 'kernel', you should factor that out the locking functions
and move it here, IMO.
> + echo -n "platform" > /sys/power/disk
> + echo -n "disk" > /sys/power/state
> + ;;
> + esac
> + fi
> run_hooks thaw reverse
> ;;
> esac
> @@ -155,3 +213,52 @@ restorestate()
> {
> eval echo \$${1}_STATE
> }
> +
> +# sanity check the environment if resume will be possible after hibernate
> +checkhibernate()
> +{
> + if [ "$HIBERNATE" = "kernel" ]; then
> + read RDEV < /sys/power/resume
> + if [ "$RDEV" = "0:0" ]; then
> + # DEBUG "no resume partition set"
> + # maybe "resume=..." was given, but initrd did not set up
> + # /sys/power/resume correctly.
> + return 1
> + fi
> + if [ -n "$IMAGE_SIZE" -a -w /sys/power/image_size ]; then
> + echo "$IMAGE_SIZE" > /sys/power/image_size 2>/dev/null
> + fi
> + fi
> + RDEV=""
> + read CMDLINE < /proc/cmdline
> + for CMD in $CMDLINE; do
> + case $CMD in
> + resume=*) RDEV=${CMD#*=}
> + break ;;
> + esac
> + done
> + if [ -z "$RDEV" ]; then
> + # DEBUG "no resume parameter"
> + return 1
> + fi
For uswsusp you don't need a resume parameter, the resume binary
doesn't do anything with it anyway...
> + while read SDEV STYPE DUMMY; do
> + [ "$STYPE" != "partition" ] && continue
> + [ "$SDEV" = "$RDEV" ] && break
> + SDEV=""
> + done < /proc/swaps
> + if [ -z "$SDEV" ]; then
> + # DEBUG "resume partition '$RDEV' not swapon'ed"
> + return 1
> + fi
All these checks can go in the if [ kernel ] part IMO,
the s2disk binary will do all these checks also ...
> + if [ "$HIBERNATE" = "userspace" ]; then
> + rm -f /var/lib/s2disk.conf
> + echo "resume device = $RDEV" >> /var/lib/s2disk.conf
Ah, now I get it. You're creating a config file on the fly... hmm. On
debian I create the /etc/suspend.conf at installation time, asking some
questions (want encryption? want splash?)
> + if [ -n "$IMAGE_SIZE" ]; then
> + echo "image size = $IMAGE_SIZE" >> /var/lib/s2disk.conf
> + # add the parameters from /etc/suspend.conf to /var/lib/s2disk.conf
> + if [ -e /etc/suspend.conf ]; then
> + sed '/^[[:space:]]*\(#\|$\)/d;' /etc/suspend.conf >> /var/lib/s2disk.conf
> + fi
IIRC, the config parser in s2disk will in the case of multiple lines for the same
parameter give precedence to the latter, so that seems OK
> + fi
> + return 0
> +}
>
>
> This is basically how i did it until now in powersaved.
> Precondition:
> - your initrd does invoke resume with the device from "resume=". I think it
> is a good idea to use the well known resume parameter also for userspace
> suspend. Generally, the user should not need to care about which method he
> uses.
> Right now i do not even copy /etc/suspend.conf into the initrd anymore
> since it is not needed for resume.
Only for splash you do, I think. You could however use a cmdline parameter
for that too.
>
> Then i generate a temporary suspend config file in /var/lib/s2disk.conf from
> the resume= parameter (read from /proc/cmdline) and from IMAGE_SIZE (which
> might be set in /etc/pm/config.d/hibernate or calculated intelligently from
> the free swap space and the total amount of system memory, this is not yet
> in this patch).
I do this in the install script for debian.
IMAGESIZE=`awk '$1 == "MemTotal:" {print int($2*1024*0.46)}' /proc/meminfo `
> I append any options from /etc/suspend.conf to this temporary config file.
> Since s2disk just takes the latest incarnation of an option, the settings
> from /etc/suspend.conf override our automatic determined setting.
> I ship an empty (all options commented out) config file, and it just works
> out of the box, if the resume= parameter is correctly set (done by the
> installer).
>
> What do you think about that?
I think, I should learn to read an e-mail before starting to write the reply:)
What I don't like about the resume= parameter is that it is a bit hard
(not allowed in debian even) to automatically change grub/menu.list or lilo.conf.
So I would want to change the above a bit, such that it will first
check if there's a 'resume device' value in /etc/suspend.conf, if that's
not there than fall back to /proc/cmdline.
Other than that, looks good.
grts Tim
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
Url : http://lists.freedesktop.org/archives/pm-utils/attachments/20061006/8f51bbab/signature.pgp
More information about the Pm-utils
mailing list