]> git.pld-linux.org Git - projects/geninitrd.git/commitdiff
- swsusp support from mis@pld-linux
authorArkadiusz Miśkiewicz <arekm@maven.pl>
Sat, 26 Dec 2020 00:03:50 +0000 (01:03 +0100)
committerArkadiusz Miśkiewicz <arekm@maven.pl>
Sat, 26 Dec 2020 00:03:50 +0000 (01:03 +0100)
Makefile
geninitrd
mod-swsusp.sh [new file with mode: 0644]

index 1994b9700cf2a595a2dc523612a320d8ce17413e..a9039b180d1090ee32193a52c61295527a1f0c5f 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 # when making release, make sure you do it as RELEASE document describes
 NAME           := geninitrd
 VERSION                := $(shell test -d .git && git describe --tags || echo git)
-MODS           := ide luks multipath dmraid lvm md blkid udev tuxonice suspend fbsplash condecor bootsplash uvesafb nfs sata scsi usbkbd bcache
+MODS           := ide luks multipath dmraid lvm md blkid udev tuxonice suspend swsusp fbsplash condecor bootsplash uvesafb nfs sata scsi usbkbd bcache
 FILES_MODS  := $(MODS:%=mod-%.sh)
 FILES_ADDON := extract-ikconfig
 FILES_UDEV  := 01-ignore.rules 59-persistent-storage.rules 61-persistent-storage.rules 11-dm.rules
index 7f5495f8b407007b2ca6df5eb0b7a72a2b6cf097..ea7d438e56abd1086cc8fec876b239626602f9fe 100755 (executable)
--- a/geninitrd
+++ b/geninitrd
@@ -1209,7 +1209,7 @@ if [ ! -f /proc/mounts ]; then
        warn "/proc filesystem not mounted, may cause wrong results or failure."
 fi
 
-geninitrd_load_mods ide luks multipath dmraid lvm md blkid udev tuxonice suspend fbsplash condecor bootsplash uvesafb nfs sata scsi usbkbd bcache
+geninitrd_load_mods ide luks multipath dmraid lvm md blkid udev swsusp tuxonice suspend fbsplash condecor bootsplash uvesafb nfs sata scsi usbkbd bcache
 
 while [ $# -gt 0 ]; do
        case $1 in
@@ -1245,6 +1245,9 @@ while [ $# -gt 0 ]; do
        --without-fbcondecor)
                FB_CON_DECOR=no
                ;;
+       --without-swsusp)
+               USE_SWSUSP=no
+               ;;
        --with-suspend)
                USE_SUSPEND=yes
                ;;
@@ -1508,6 +1511,10 @@ if is_yes "$USE_SUSPEND"; then
        find_modules_suspend
 fi
 
+if is_yes "$USE_SWSUSP"; then
+       find_modules_swsusp
+fi
+
 find_root "$fstab" || exit
 verbose "Using $rootdev as device for rootfs"
 
@@ -1703,6 +1710,7 @@ initrd_gen_stop_uvesafb
 # resume after killing local processes
 initrd_gen_tuxonice
 initrd_gen_suspend
+initrd_gen_swsusp
 
 # clean up env
 add_linuxrc <<-'EOF'
diff --git a/mod-swsusp.sh b/mod-swsusp.sh
new file mode 100644 (file)
index 0000000..d6ade58
--- /dev/null
@@ -0,0 +1,74 @@
+#!/bin/sh
+# geninitrd mod: swsusp
+#
+USE_SWSUSP=${USE_SWSUSP:-yes}
+
+# resume device
+swap_dev=""
+
+# setup geninitrd module
+# @access      public
+setup_mod_swsusp() {
+       if ! is_yes "$USE_SWSUSP"; then
+               return
+       fi
+
+       swap_dev="$(awk '/^\/dev\// { print $1 }' /proc/swaps | head -1)"
+       if [ -z "$swap_dev" ]; then
+           warn "Cannot determine swap device. You may try add specific device to kernel command line"
+       else
+           verbose "swsusp: will try to resume from swap device $swap_dev"
+       fi
+}
+
+# find modules for for swsusp
+# @access      public
+find_modules_swsusp() {
+       swap_dev="$(awk '/^\/dev\// { print $1 }' /proc/swaps | head -1)"
+
+       # save state
+       local vgvolumes=$LVM_VGVOLUMES
+       find_modules_for_devpath $swap_dev
+
+       # check for saved state, differenciate between rootfs VG
+       if [ "$LVM_VGVOLUMES" != "$vgvolumes" ]; then
+               # add swap device to LVM_SUSPENDVG
+               LVM_SUSPENDVG="$LVM_SUSPENDVG $LVM_VGVOLUMES"
+               LVM_VGVOLUMES=$vgvolumes
+               verbose "swap device is on LVM"
+       fi
+}
+
+# generate initrd fragment
+# @access      public
+initrd_gen_swsusp() {
+       if ! is_yes "$USE_SWSUSP"; then
+               return
+       fi
+
+       verbose "Setting up swsusp..."
+
+       mkdir -p $DESTDIR${swap_dev%/*}
+       inst $swap_dev $swap_dev
+
+        mount_dev
+       mount_sys
+        echo "swap_dev=$swap_dev" | add_linuxrc
+
+       add_linuxrc <<-'EOF'
+       resume=no
+       for arg in $CMDLINE; do
+               if [ "${arg##resume=/dev/}" != "${arg}" ]; then
+                       swap_dev=${arg##resume=}
+                       resume=yes
+               elif [ "${arg##resume=}" != "${arg}" ]; then
+                       resume=${arg##resume=}
+               fi
+       done
+
+       if [ "$resume" = "yes" ] && [ -n "$swap_dev" ]; then
+               echo "Resuming from $swap_dev..."
+               echo "$swap_dev" > /sys/power/resume
+       fi
+       EOF
+}
This page took 0.410618 seconds and 4 git commands to generate.