diff options
author | Mario Limonciello <superm1@gmail.com> | 2018-03-08 21:17:33 +0800 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2018-03-08 14:17:33 +0100 |
commit | c58493c00af97146d3b6c24da9c0371978124703 (patch) | |
tree | eef8dce2e68194b33df3faec0631bee8543a175b /src/login/logind-action.c | |
parent | fc17f194ded93b51899aa0bbd4e66870d975fe5a (diff) | |
download | systemd-c58493c00af97146d3b6c24da9c0371978124703.tar.gz |
Introduce suspend-to-hibernate (#8274)
Suspend to Hibernate is a new sleep method that invokes suspend
for a predefined period of time before automatically waking up
and hibernating the system.
It's similar to HybridSleep however there isn't a performance
impact on every suspend cycle.
It's intended to use with systems that may have a higher power
drain in their supported suspend states to prevent battery and
data loss over an extended suspend cycle.
Signed-off-by: Mario Limonciello <mario.limonciello@dell.com>
Diffstat (limited to 'src/login/logind-action.c')
-rw-r--r-- | src/login/logind-action.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/src/login/logind-action.c b/src/login/logind-action.c index 852ea9f949..0e8e0b2e4a 100644 --- a/src/login/logind-action.c +++ b/src/login/logind-action.c @@ -47,7 +47,8 @@ int manager_handle_action( [HANDLE_KEXEC] = "Rebooting via kexec...", [HANDLE_SUSPEND] = "Suspending...", [HANDLE_HIBERNATE] = "Hibernating...", - [HANDLE_HYBRID_SLEEP] = "Hibernating and suspending..." + [HANDLE_HYBRID_SLEEP] = "Hibernating and suspending...", + [HANDLE_SUSPEND_TO_HIBERNATE] = "Suspending to hibernate...", }; static const char * const target_table[_HANDLE_ACTION_MAX] = { @@ -57,7 +58,8 @@ int manager_handle_action( [HANDLE_KEXEC] = SPECIAL_KEXEC_TARGET, [HANDLE_SUSPEND] = SPECIAL_SUSPEND_TARGET, [HANDLE_HIBERNATE] = SPECIAL_HIBERNATE_TARGET, - [HANDLE_HYBRID_SLEEP] = SPECIAL_HYBRID_SLEEP_TARGET + [HANDLE_HYBRID_SLEEP] = SPECIAL_HYBRID_SLEEP_TARGET, + [HANDLE_SUSPEND_TO_HIBERNATE] = SPECIAL_SUSPEND_TO_HIBERNATE_TARGET, }; _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; @@ -110,6 +112,8 @@ int manager_handle_action( supported = can_sleep("hibernate") > 0; else if (handle == HANDLE_HYBRID_SLEEP) supported = can_sleep("hybrid-sleep") > 0; + else if (handle == HANDLE_SUSPEND_TO_HIBERNATE) + supported = can_sleep("suspend-to-hibernate") > 0; else if (handle == HANDLE_KEXEC) supported = access(KEXEC, X_OK) >= 0; else @@ -125,7 +129,9 @@ int manager_handle_action( return -EALREADY; } - inhibit_operation = IN_SET(handle, HANDLE_SUSPEND, HANDLE_HIBERNATE, HANDLE_HYBRID_SLEEP) ? INHIBIT_SLEEP : INHIBIT_SHUTDOWN; + inhibit_operation = IN_SET(handle, HANDLE_SUSPEND, HANDLE_HIBERNATE, + HANDLE_HYBRID_SLEEP, + HANDLE_SUSPEND_TO_HIBERNATE) ? INHIBIT_SLEEP : INHIBIT_SHUTDOWN; /* If the actual operation is inhibited, warn and fail */ if (!ignore_inhibited && @@ -172,6 +178,7 @@ static const char* const handle_action_table[_HANDLE_ACTION_MAX] = { [HANDLE_SUSPEND] = "suspend", [HANDLE_HIBERNATE] = "hibernate", [HANDLE_HYBRID_SLEEP] = "hybrid-sleep", + [HANDLE_SUSPEND_TO_HIBERNATE] = "suspend-to-hibernate", [HANDLE_LOCK] = "lock" }; |