summaryrefslogtreecommitdiff
path: root/src/login/logind-action.c
diff options
context:
space:
mode:
authorMario Limonciello <superm1@gmail.com>2018-03-08 21:17:33 +0800
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2018-03-08 14:17:33 +0100
commitc58493c00af97146d3b6c24da9c0371978124703 (patch)
treeeef8dce2e68194b33df3faec0631bee8543a175b /src/login/logind-action.c
parentfc17f194ded93b51899aa0bbd4e66870d975fe5a (diff)
downloadsystemd-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.c13
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"
};