|
|
7e7c9f |
From b77d7c2a22c679cb9445f34c59462804051bd12f Mon Sep 17 00:00:00 2001
|
|
|
f4d4e0 |
From: Lennart Poettering <lennart@poettering.net>
|
|
|
f4d4e0 |
Date: Mon, 25 Sep 2017 19:53:19 +0200
|
|
|
f4d4e0 |
Subject: [PATCH] swap: adjust swap.c in a similar way to what we just did to
|
|
|
f4d4e0 |
mount.c
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
Also drop the redundant states and make all similar changes too.
|
|
|
f4d4e0 |
Thankfully the swap.c state engine is much simpler than mount.c's, hence
|
|
|
f4d4e0 |
this should be easier to digest.
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
(cherry picked from commit 50864457e1bc5f7a4ab2fd02e1565bc5d135d2f3)
|
|
|
f4d4e0 |
|
|
|
7e7c9f |
Related: #1749621
|
|
|
f4d4e0 |
---
|
|
|
f4d4e0 |
src/core/swap.c | 96 +++++++++++++++++++++++--------------------------
|
|
|
f4d4e0 |
src/core/swap.h | 2 --
|
|
|
f4d4e0 |
2 files changed, 44 insertions(+), 54 deletions(-)
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
diff --git a/src/core/swap.c b/src/core/swap.c
|
|
|
f4d4e0 |
index 4a5e882332..c9cce3d945 100644
|
|
|
f4d4e0 |
--- a/src/core/swap.c
|
|
|
f4d4e0 |
+++ b/src/core/swap.c
|
|
|
f4d4e0 |
@@ -49,8 +49,6 @@ static const UnitActiveState state_translation_table[_SWAP_STATE_MAX] = {
|
|
|
f4d4e0 |
[SWAP_ACTIVATING_DONE] = UNIT_ACTIVE,
|
|
|
f4d4e0 |
[SWAP_ACTIVE] = UNIT_ACTIVE,
|
|
|
f4d4e0 |
[SWAP_DEACTIVATING] = UNIT_DEACTIVATING,
|
|
|
f4d4e0 |
- [SWAP_ACTIVATING_SIGTERM] = UNIT_DEACTIVATING,
|
|
|
f4d4e0 |
- [SWAP_ACTIVATING_SIGKILL] = UNIT_DEACTIVATING,
|
|
|
f4d4e0 |
[SWAP_DEACTIVATING_SIGTERM] = UNIT_DEACTIVATING,
|
|
|
f4d4e0 |
[SWAP_DEACTIVATING_SIGKILL] = UNIT_DEACTIVATING,
|
|
|
f4d4e0 |
[SWAP_FAILED] = UNIT_FAILED
|
|
|
f4d4e0 |
@@ -490,8 +488,6 @@ static void swap_set_state(Swap *s, SwapState state) {
|
|
|
f4d4e0 |
s->state = state;
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
if (state != SWAP_ACTIVATING &&
|
|
|
f4d4e0 |
- state != SWAP_ACTIVATING_SIGTERM &&
|
|
|
f4d4e0 |
- state != SWAP_ACTIVATING_SIGKILL &&
|
|
|
f4d4e0 |
state != SWAP_ACTIVATING_DONE &&
|
|
|
f4d4e0 |
state != SWAP_DEACTIVATING &&
|
|
|
f4d4e0 |
state != SWAP_DEACTIVATING_SIGTERM &&
|
|
|
f4d4e0 |
@@ -538,8 +534,6 @@ static int swap_coldplug(Unit *u, Hashmap *deferred_work) {
|
|
|
f4d4e0 |
return 0;
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
if (new_state == SWAP_ACTIVATING ||
|
|
|
f4d4e0 |
- new_state == SWAP_ACTIVATING_SIGTERM ||
|
|
|
f4d4e0 |
- new_state == SWAP_ACTIVATING_SIGKILL ||
|
|
|
f4d4e0 |
new_state == SWAP_ACTIVATING_DONE ||
|
|
|
f4d4e0 |
new_state == SWAP_DEACTIVATING ||
|
|
|
f4d4e0 |
new_state == SWAP_DEACTIVATING_SIGTERM ||
|
|
|
f4d4e0 |
@@ -682,6 +676,15 @@ static void swap_enter_active(Swap *s, SwapResult f) {
|
|
|
f4d4e0 |
swap_set_state(s, SWAP_ACTIVE);
|
|
|
f4d4e0 |
}
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
+static void swap_enter_dead_or_active(Swap *s, SwapResult f) {
|
|
|
f4d4e0 |
+ assert(s);
|
|
|
f4d4e0 |
+
|
|
|
f4d4e0 |
+ if (s->from_proc_swaps)
|
|
|
f4d4e0 |
+ swap_enter_active(s, f);
|
|
|
f4d4e0 |
+ else
|
|
|
f4d4e0 |
+ swap_enter_dead(s, f);
|
|
|
f4d4e0 |
+}
|
|
|
f4d4e0 |
+
|
|
|
f4d4e0 |
static void swap_enter_signal(Swap *s, SwapState state, SwapResult f) {
|
|
|
f4d4e0 |
int r;
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
@@ -693,8 +696,7 @@ static void swap_enter_signal(Swap *s, SwapState state, SwapResult f) {
|
|
|
f4d4e0 |
r = unit_kill_context(
|
|
|
f4d4e0 |
UNIT(s),
|
|
|
f4d4e0 |
&s->kill_context,
|
|
|
f4d4e0 |
- (state != SWAP_ACTIVATING_SIGTERM && state != SWAP_DEACTIVATING_SIGTERM) ?
|
|
|
f4d4e0 |
- KILL_KILL : KILL_TERMINATE,
|
|
|
f4d4e0 |
+ state != SWAP_DEACTIVATING_SIGTERM ? KILL_KILL : KILL_TERMINATE,
|
|
|
f4d4e0 |
-1,
|
|
|
f4d4e0 |
s->control_pid,
|
|
|
f4d4e0 |
false);
|
|
|
f4d4e0 |
@@ -707,18 +709,16 @@ static void swap_enter_signal(Swap *s, SwapState state, SwapResult f) {
|
|
|
f4d4e0 |
goto fail;
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
swap_set_state(s, state);
|
|
|
f4d4e0 |
- } else if (state == SWAP_ACTIVATING_SIGTERM)
|
|
|
f4d4e0 |
- swap_enter_signal(s, SWAP_ACTIVATING_SIGKILL, SWAP_SUCCESS);
|
|
|
f4d4e0 |
- else if (state == SWAP_DEACTIVATING_SIGTERM)
|
|
|
f4d4e0 |
+ } else if (state == SWAP_DEACTIVATING_SIGTERM && s->kill_context.send_sigkill)
|
|
|
f4d4e0 |
swap_enter_signal(s, SWAP_DEACTIVATING_SIGKILL, SWAP_SUCCESS);
|
|
|
f4d4e0 |
else
|
|
|
f4d4e0 |
- swap_enter_dead(s, SWAP_SUCCESS);
|
|
|
f4d4e0 |
+ swap_enter_dead_or_active(s, SWAP_SUCCESS);
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
return;
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
fail:
|
|
|
f4d4e0 |
log_unit_warning_errno(UNIT(s)->id, r, "%s failed to kill processes: %m", UNIT(s)->id);
|
|
|
f4d4e0 |
- swap_enter_dead(s, SWAP_FAILURE_RESOURCES);
|
|
|
f4d4e0 |
+ swap_enter_dead_or_active(s, SWAP_FAILURE_RESOURCES);
|
|
|
f4d4e0 |
}
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
static void swap_enter_activating(Swap *s) {
|
|
|
f4d4e0 |
@@ -781,7 +781,7 @@ static void swap_enter_activating(Swap *s) {
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
fail:
|
|
|
f4d4e0 |
log_unit_warning_errno(UNIT(s)->id, r, "%s failed to run 'swapon' task: %m", UNIT(s)->id);
|
|
|
f4d4e0 |
- swap_enter_dead(s, SWAP_FAILURE_RESOURCES);
|
|
|
f4d4e0 |
+ swap_enter_dead_or_active(s, SWAP_FAILURE_RESOURCES);
|
|
|
f4d4e0 |
}
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
static void swap_enter_deactivating(Swap *s) {
|
|
|
f4d4e0 |
@@ -811,7 +811,7 @@ static void swap_enter_deactivating(Swap *s) {
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
fail:
|
|
|
f4d4e0 |
log_unit_warning_errno(UNIT(s)->id, r, "%s failed to run 'swapoff' task: %m", UNIT(s)->id);
|
|
|
f4d4e0 |
- swap_enter_active(s, SWAP_FAILURE_RESOURCES);
|
|
|
f4d4e0 |
+ swap_enter_dead_or_active(s, SWAP_FAILURE_RESOURCES);
|
|
|
f4d4e0 |
}
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
static int swap_start(Unit *u) {
|
|
|
f4d4e0 |
@@ -824,11 +824,10 @@ static int swap_start(Unit *u) {
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
if (s->state == SWAP_DEACTIVATING ||
|
|
|
f4d4e0 |
s->state == SWAP_DEACTIVATING_SIGTERM ||
|
|
|
f4d4e0 |
- s->state == SWAP_DEACTIVATING_SIGKILL ||
|
|
|
f4d4e0 |
- s->state == SWAP_ACTIVATING_SIGTERM ||
|
|
|
f4d4e0 |
- s->state == SWAP_ACTIVATING_SIGKILL)
|
|
|
f4d4e0 |
+ s->state == SWAP_DEACTIVATING_SIGKILL)
|
|
|
f4d4e0 |
return -EAGAIN;
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
+ /* Already on it! */
|
|
|
f4d4e0 |
if (s->state == SWAP_ACTIVATING)
|
|
|
f4d4e0 |
return 0;
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
@@ -854,22 +853,30 @@ static int swap_stop(Unit *u) {
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
assert(s);
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
- if (s->state == SWAP_DEACTIVATING ||
|
|
|
f4d4e0 |
- s->state == SWAP_DEACTIVATING_SIGTERM ||
|
|
|
f4d4e0 |
- s->state == SWAP_DEACTIVATING_SIGKILL ||
|
|
|
f4d4e0 |
- s->state == SWAP_ACTIVATING_SIGTERM ||
|
|
|
f4d4e0 |
- s->state == SWAP_ACTIVATING_SIGKILL)
|
|
|
f4d4e0 |
+ switch (s->state) {
|
|
|
f4d4e0 |
+
|
|
|
f4d4e0 |
+ case SWAP_DEACTIVATING:
|
|
|
f4d4e0 |
+ case SWAP_DEACTIVATING_SIGTERM:
|
|
|
f4d4e0 |
+ case SWAP_DEACTIVATING_SIGKILL:
|
|
|
f4d4e0 |
+ /* Already on it */
|
|
|
f4d4e0 |
+ return 0;
|
|
|
f4d4e0 |
+
|
|
|
f4d4e0 |
+ case SWAP_ACTIVATING:
|
|
|
f4d4e0 |
+ case SWAP_ACTIVATING_DONE:
|
|
|
f4d4e0 |
+ /* There's a control process pending, directly enter kill mode */
|
|
|
f4d4e0 |
+ swap_enter_signal(s, SWAP_DEACTIVATING_SIGTERM, SWAP_SUCCESS);
|
|
|
f4d4e0 |
return 0;
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
- assert(s->state == SWAP_ACTIVATING ||
|
|
|
f4d4e0 |
- s->state == SWAP_ACTIVATING_DONE ||
|
|
|
f4d4e0 |
- s->state == SWAP_ACTIVE);
|
|
|
f4d4e0 |
+ case SWAP_ACTIVE:
|
|
|
f4d4e0 |
+ if (detect_container(NULL) > 0)
|
|
|
f4d4e0 |
+ return -EPERM;
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
- if (detect_container(NULL) > 0)
|
|
|
f4d4e0 |
- return -EPERM;
|
|
|
f4d4e0 |
+ swap_enter_deactivating(s);
|
|
|
f4d4e0 |
+ return 1;
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
- swap_enter_deactivating(s);
|
|
|
f4d4e0 |
- return 1;
|
|
|
f4d4e0 |
+ default:
|
|
|
f4d4e0 |
+ assert_not_reached("Unexpected state.");
|
|
|
f4d4e0 |
+ }
|
|
|
f4d4e0 |
}
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
static int swap_serialize(Unit *u, FILE *f, FDSet *fds) {
|
|
|
f4d4e0 |
@@ -1002,10 +1009,8 @@ static void swap_sigchld_event(Unit *u, pid_t pid, int code, int status) {
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
case SWAP_ACTIVATING:
|
|
|
f4d4e0 |
case SWAP_ACTIVATING_DONE:
|
|
|
f4d4e0 |
- case SWAP_ACTIVATING_SIGTERM:
|
|
|
f4d4e0 |
- case SWAP_ACTIVATING_SIGKILL:
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
- if (f == SWAP_SUCCESS)
|
|
|
f4d4e0 |
+ if (f == SWAP_SUCCESS || s->from_proc_swaps)
|
|
|
f4d4e0 |
swap_enter_active(s, f);
|
|
|
f4d4e0 |
else
|
|
|
f4d4e0 |
swap_enter_dead(s, f);
|
|
|
f4d4e0 |
@@ -1015,7 +1020,7 @@ static void swap_sigchld_event(Unit *u, pid_t pid, int code, int status) {
|
|
|
f4d4e0 |
case SWAP_DEACTIVATING_SIGKILL:
|
|
|
f4d4e0 |
case SWAP_DEACTIVATING_SIGTERM:
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
- swap_enter_dead(s, f);
|
|
|
f4d4e0 |
+ swap_enter_dead_or_active(s, f);
|
|
|
f4d4e0 |
break;
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
default:
|
|
|
f4d4e0 |
@@ -1037,7 +1042,7 @@ static int swap_dispatch_timer(sd_event_source *source, usec_t usec, void *userd
|
|
|
f4d4e0 |
case SWAP_ACTIVATING:
|
|
|
f4d4e0 |
case SWAP_ACTIVATING_DONE:
|
|
|
f4d4e0 |
log_unit_warning(UNIT(s)->id, "%s activation timed out. Stopping.", UNIT(s)->id);
|
|
|
f4d4e0 |
- swap_enter_signal(s, SWAP_ACTIVATING_SIGTERM, SWAP_FAILURE_TIMEOUT);
|
|
|
f4d4e0 |
+ swap_enter_signal(s, SWAP_DEACTIVATING_SIGTERM, SWAP_FAILURE_TIMEOUT);
|
|
|
f4d4e0 |
break;
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
case SWAP_DEACTIVATING:
|
|
|
f4d4e0 |
@@ -1045,30 +1050,19 @@ static int swap_dispatch_timer(sd_event_source *source, usec_t usec, void *userd
|
|
|
f4d4e0 |
swap_enter_signal(s, SWAP_DEACTIVATING_SIGTERM, SWAP_FAILURE_TIMEOUT);
|
|
|
f4d4e0 |
break;
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
- case SWAP_ACTIVATING_SIGTERM:
|
|
|
f4d4e0 |
- if (s->kill_context.send_sigkill) {
|
|
|
f4d4e0 |
- log_unit_warning(UNIT(s)->id, "%s activation timed out. Killing.", UNIT(s)->id);
|
|
|
f4d4e0 |
- swap_enter_signal(s, SWAP_ACTIVATING_SIGKILL, SWAP_FAILURE_TIMEOUT);
|
|
|
f4d4e0 |
- } else {
|
|
|
f4d4e0 |
- log_unit_warning(UNIT(s)->id, "%s activation timed out. Skipping SIGKILL. Ignoring.", UNIT(s)->id);
|
|
|
f4d4e0 |
- swap_enter_dead(s, SWAP_FAILURE_TIMEOUT);
|
|
|
f4d4e0 |
- }
|
|
|
f4d4e0 |
- break;
|
|
|
f4d4e0 |
-
|
|
|
f4d4e0 |
case SWAP_DEACTIVATING_SIGTERM:
|
|
|
f4d4e0 |
if (s->kill_context.send_sigkill) {
|
|
|
f4d4e0 |
- log_unit_warning(UNIT(s)->id, "%s deactivation timed out. Killing.", UNIT(s)->id);
|
|
|
f4d4e0 |
+ log_unit_warning(UNIT(s)->id, "Swap process timed out. Killing.");
|
|
|
f4d4e0 |
swap_enter_signal(s, SWAP_DEACTIVATING_SIGKILL, SWAP_FAILURE_TIMEOUT);
|
|
|
f4d4e0 |
} else {
|
|
|
f4d4e0 |
- log_unit_warning(UNIT(s)->id, "%s deactivation timed out. Skipping SIGKILL. Ignoring.", UNIT(s)->id);
|
|
|
f4d4e0 |
- swap_enter_dead(s, SWAP_FAILURE_TIMEOUT);
|
|
|
f4d4e0 |
+ log_unit_warning(UNIT(s)->id, "Swap process timed out. Skipping SIGKILL. Ignoring.");
|
|
|
f4d4e0 |
+ swap_enter_dead_or_active(s, SWAP_FAILURE_TIMEOUT);
|
|
|
f4d4e0 |
}
|
|
|
f4d4e0 |
break;
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
- case SWAP_ACTIVATING_SIGKILL:
|
|
|
f4d4e0 |
case SWAP_DEACTIVATING_SIGKILL:
|
|
|
f4d4e0 |
log_unit_warning(UNIT(s)->id, "%s swap process still around after SIGKILL. Ignoring.", UNIT(s)->id);
|
|
|
f4d4e0 |
- swap_enter_dead(s, SWAP_FAILURE_TIMEOUT);
|
|
|
f4d4e0 |
+ swap_enter_dead_or_active(s, SWAP_FAILURE_TIMEOUT);
|
|
|
f4d4e0 |
break;
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
default:
|
|
|
f4d4e0 |
@@ -1428,8 +1422,6 @@ static const char* const swap_state_table[_SWAP_STATE_MAX] = {
|
|
|
f4d4e0 |
[SWAP_ACTIVATING_DONE] = "activating-done",
|
|
|
f4d4e0 |
[SWAP_ACTIVE] = "active",
|
|
|
f4d4e0 |
[SWAP_DEACTIVATING] = "deactivating",
|
|
|
f4d4e0 |
- [SWAP_ACTIVATING_SIGTERM] = "activating-sigterm",
|
|
|
f4d4e0 |
- [SWAP_ACTIVATING_SIGKILL] = "activating-sigkill",
|
|
|
f4d4e0 |
[SWAP_DEACTIVATING_SIGTERM] = "deactivating-sigterm",
|
|
|
f4d4e0 |
[SWAP_DEACTIVATING_SIGKILL] = "deactivating-sigkill",
|
|
|
f4d4e0 |
[SWAP_FAILED] = "failed"
|
|
|
f4d4e0 |
diff --git a/src/core/swap.h b/src/core/swap.h
|
|
|
f4d4e0 |
index 914a2dbccd..f46873b5e1 100644
|
|
|
f4d4e0 |
--- a/src/core/swap.h
|
|
|
f4d4e0 |
+++ b/src/core/swap.h
|
|
|
f4d4e0 |
@@ -34,8 +34,6 @@ typedef enum SwapState {
|
|
|
f4d4e0 |
SWAP_ACTIVATING_DONE, /* /sbin/swapon is running, and the swap is done. */
|
|
|
f4d4e0 |
SWAP_ACTIVE,
|
|
|
f4d4e0 |
SWAP_DEACTIVATING,
|
|
|
f4d4e0 |
- SWAP_ACTIVATING_SIGTERM,
|
|
|
f4d4e0 |
- SWAP_ACTIVATING_SIGKILL,
|
|
|
f4d4e0 |
SWAP_DEACTIVATING_SIGTERM,
|
|
|
f4d4e0 |
SWAP_DEACTIVATING_SIGKILL,
|
|
|
f4d4e0 |
SWAP_FAILED,
|