Blob Blame History Raw
commit dabd0e900f6e10c358436c584c51dd1f55c320d2
Author: Thomas Koch <linrunner@gmx.net>
Date:   Sun Mar 12 20:53:32 2017 +0100

    Issue #242: mitigate slow shutdown
    
    Rationale: 'systemctl stop tlp' invokes 'nmcli radio on <device>' in systemd
    context. This causes nmcli to hang for ~20 sec after switching the device.
    The cause is unknown – when invoking nmcli directly it doesn't hang.
    
    Workaround:
    * Execute radio switching last in 'tlp init [start|stop]'
    * Add TimeoutStopSec=3 to tlp.service so systemd will kill the hanging
      stop task after 3 secs.
    
    Caveat: does not cover all cases yet. When two radios (e.g. wifi and
    wwan) are to be switched, the second switch never happens.

diff --git a/tlp.in b/tlp.in
index bc2f852..fd0486c 100644
--- a/tlp.in
+++ b/tlp.in
@@ -96,23 +96,21 @@ case "$mode" in
         # do init business ...
         case $mode2 in
             start)
-                # apply radio states
-                set_radio_device_states start
-
-                # apply power save settings -- but only if not previously run
-                # (by the udev rule) for the same power state
-                if compare_and_save_power_state $pwrmode; then
-                    echo -n "Applying power save settings..."
-                    apply_common_settings $pwrmode
-                    [ "$pwrmode" = "1" ] && poweroff_drivebay 0
-                    [ "$X_TLP_USB_MODE" = "1" ] && set_usb_suspend 0 auto
-                    echo "done."
-                fi
+                # apply power save settings
+                compare_and_save_power_state $pwrmode
+                echo -n "Applying power save settings..."
+                apply_common_settings $pwrmode
+                poweroff_drivebay $pwrmode 0
+                [ "$X_TLP_USB_MODE" = "1" ] && set_usb_suspend 0 auto
+                echo "done."
 
                 # apply battery settings
                 echo -n "Setting battery charge thresholds..."
                 set_charge_thresholds
                 echo "done."
+
+                # apply radio states
+                set_radio_device_states start
                 ;;
 
             restart|force-reload)
@@ -131,14 +129,6 @@ case "$mode" in
                 ;;
 
             stop)
-                set_radio_device_states stop
-
-                if [ "$USB_AUTOSUSPEND_DISABLE_ON_SHUTDOWN" = "1" ]; then
-                    echo -n "Disabling usb autosuspend..."
-                    set_usb_suspend 0 on
-                    echo "done."
-                fi
-
                 # remove usb startup flag
                 [ -f $USB_DONE ] && rm $USB_DONE
 
@@ -149,6 +139,16 @@ case "$mode" in
                 echo -n "Applying power save settings..."
                 apply_common_settings 0
                 echo "done."
+
+                # disable usb autosuspend if configured
+                if [ "$USB_AUTOSUSPEND_DISABLE_ON_SHUTDOWN" = "1" ]; then
+                    echo -n "Disabling usb autosuspend..."
+                    set_usb_suspend 0 on
+                    echo "done."
+                fi
+
+                # apply radio states
+                set_radio_device_states stop
                 ;;
 
             *)
diff --git a/tlp.service.in b/tlp.service.in
index 7dc4b2c..67c131c 100644
--- a/tlp.service.in
+++ b/tlp.service.in
@@ -15,6 +15,7 @@ Type=oneshot
 RemainAfterExit=yes
 ExecStart=@TLP_SBIN@/tlp init start
 ExecStop=@TLP_SBIN@/tlp init stop
+TimeoutStopSec=3
 
 [Install]
 WantedBy=multi-user.target