:: Re: [DNG] Beowulf to Chimaera updat…
Top Page
Delete this message
Reply to this message
Author: Brad Campbell
Date:  
To: dng
Subject: Re: [DNG] Beowulf to Chimaera update breaks suspend on laptop
On 7/4/22 20:58, Brad Campbell via Dng wrote:
> G'day,
>
> I could use a bit of advice if anyone has the relevant experience.
>
> My laptop is running Devuan Beowulf currently, but this suspend config goes back at least 10 years.
> It suspends / hibernates using pm-utils with the uswsusp back-end onto a dmycrypted swap partition. The kernel is vanilla with a cut-down config and locally compiled.
>
> This works flawlessly and has done since I set it up. The GUI is xfce4 and when I hit the power button xfce4-power-manager does all the right things (which is hit up pm-utils and get out of its way).
>
> Last night I upgraded to Chimaera. This installed elogind and tries to use that to pull the relevant kernel levers to suspend. Unfortunately on my system, while it suspends most times, it comes back about 1 in 10 and then usually the nvme is broken and it dies in a ball of flames. I spent the best part of a day experimenting with the in-kernel suspend mechanisms and I can't seem to make it work, while the trusty old uswsusp userspace suspend/resume works first time every time.
>
> So, I'm asking for either :
> - Experience in making the in-kernel mechanisms work; or preferably
> - How to remove elogind from an xfce4 Chimaera install and make xfce4-power-manager use pm-utils like it used to.
>
> Does anyone have any ideas?
>


Just to follow this up, it appears to be related to power management. When unplugged pm-utils pulls a pile of levers in the kernel to reduce power consumption. This does reduce on-battery consumption significantly, but it also breaks resume on a number of pcie devices. In the past I had issues with both brcmfmac and the xhci driver, so I was unloading those pre-suspend and re-loading on resume. I also had to serialize the device suspend as async seemed to lock up.

By inserting some magic into the suspend hook to undo all the power management magic, it would appear I no longer need to unload any modules and suspend, hibernate and hybrid suspend all work and resume as-was.

I don't want to speak too soon, but so far I have 24 hybrid cycles on the machine and it's still resuming ok.

To be specific, pre-suspend I'm using :

    echo 0 > /sys/power/pm_async
    echo default > /sys/module/pcie_aspm/parameters/policy 
    /usr/lib/pm-utils/power.d/pci_devices false


Async device freeze off and then undo all the power saving modes.

Once I'm convinced it's reliable, I'll start peeling these commands back one by one to see which one(s) cause the issues, but at the moment it's looking happy.

Now, why this all works on Beowulf and doesn't on Chimaera is entirely a mystery give the pm-utils, uswsusp and kernel config is identical is beyond me, but I figure as both pm-utils and uswsusp are effectively dead I'm going to have to use the in-kernel stuff at some point.

My current hook script in /lib/elogind/system-sleep/Hooks.sh :

#!/bin/bash
do_wakeup () {
    for i in LID0 XHC1 ; do
        if [ -z "`cat /proc/acpi/wakeup | grep $i | grep disabled`" ] ; then
            echo $i > /proc/acpi/wakeup
        fi;
    done;
}


do_suspend() {
    echo N > /sys/module/printk/parameters/console_suspend
    echo 0 > /sys/power/image_size
    echo 0 > /sys/power/pm_async
    echo default > /sys/module/pcie_aspm/parameters/policy 
    /usr/lib/pm-utils/power.d/pci_devices false
    do_wakeup
    /etc/init.d/openvpn stop
    xscreensaver-command -lock
    sync
}


do_resume() {
    for i in gpe66 gpe4E ; do
            echo disable > /sys/firmware/acpi/interrupts/$i 2>/dev/null
    done;
    do_wakeup
    rfkill block bluetooth
    echo 120 > /sys/class/leds/smc::kbd_backlight/brightness
    xscreensaver-command -deactivate
    if [ "`cat /sys/class/power_supply/ADP1/online`" -eq 1 ] ; then
           pm-powersave false
        else
           pm-powersave true
     fi           


}
PID=`pgrep xfce4-session`
USER=`ps -p $PID -o ruser=`
export DISPLAY=:0.0
export XAUTHORITY=/home/$USER/.Xauthority

case $1/$2 in
    pre/*)
    do_suspend
    ;;
    post/*)
    do_resume
    ;;
esac



Regards,
Brad