1 /* SPDX-License-Identifier: LGPL-2.1+ */
10 #include "alloc-util.h"
11 #include "dbus-swap.h"
12 #include "device-private.h"
13 #include "device-util.h"
16 #include "exit-status.h"
18 #include "format-util.h"
19 #include "fstab-util.h"
20 #include "parse-util.h"
21 #include "path-util.h"
22 #include "process-util.h"
23 #include "serialize.h"
25 #include "string-table.h"
26 #include "string-util.h"
28 #include "unit-name.h"
32 static const UnitActiveState state_translation_table
[_SWAP_STATE_MAX
] = {
33 [SWAP_DEAD
] = UNIT_INACTIVE
,
34 [SWAP_ACTIVATING
] = UNIT_ACTIVATING
,
35 [SWAP_ACTIVATING_DONE
] = UNIT_ACTIVE
,
36 [SWAP_ACTIVE
] = UNIT_ACTIVE
,
37 [SWAP_DEACTIVATING
] = UNIT_DEACTIVATING
,
38 [SWAP_DEACTIVATING_SIGTERM
] = UNIT_DEACTIVATING
,
39 [SWAP_DEACTIVATING_SIGKILL
] = UNIT_DEACTIVATING
,
40 [SWAP_FAILED
] = UNIT_FAILED
43 static int swap_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
);
44 static int swap_dispatch_io(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
);
46 static bool SWAP_STATE_WITH_PROCESS(SwapState state
) {
51 SWAP_DEACTIVATING_SIGTERM
,
52 SWAP_DEACTIVATING_SIGKILL
);
55 static void swap_unset_proc_swaps(Swap
*s
) {
58 if (!s
->from_proc_swaps
)
61 s
->parameters_proc_swaps
.what
= mfree(s
->parameters_proc_swaps
.what
);
63 s
->from_proc_swaps
= false;
66 static int swap_set_devnode(Swap
*s
, const char *devnode
) {
73 r
= hashmap_ensure_allocated(&UNIT(s
)->manager
->swaps_by_devnode
, &path_hash_ops
);
77 swaps
= UNIT(s
)->manager
->swaps_by_devnode
;
80 first
= hashmap_get(swaps
, s
->devnode
);
82 LIST_REMOVE(same_devnode
, first
, s
);
84 hashmap_replace(swaps
, first
->devnode
, first
);
86 hashmap_remove(swaps
, s
->devnode
);
88 s
->devnode
= mfree(s
->devnode
);
92 s
->devnode
= strdup(devnode
);
96 first
= hashmap_get(swaps
, s
->devnode
);
97 LIST_PREPEND(same_devnode
, first
, s
);
99 return hashmap_replace(swaps
, first
->devnode
, first
);
105 static void swap_init(Unit
*u
) {
109 assert(UNIT(s
)->load_state
== UNIT_STUB
);
111 s
->timeout_usec
= u
->manager
->default_timeout_start_usec
;
113 s
->exec_context
.std_output
= u
->manager
->default_std_output
;
114 s
->exec_context
.std_error
= u
->manager
->default_std_error
;
116 s
->parameters_proc_swaps
.priority
= s
->parameters_fragment
.priority
= -1;
118 s
->control_command_id
= _SWAP_EXEC_COMMAND_INVALID
;
120 u
->ignore_on_isolate
= true;
123 static void swap_unwatch_control_pid(Swap
*s
) {
126 if (s
->control_pid
<= 0)
129 unit_unwatch_pid(UNIT(s
), s
->control_pid
);
133 static void swap_done(Unit
*u
) {
138 swap_unset_proc_swaps(s
);
139 swap_set_devnode(s
, NULL
);
141 s
->what
= mfree(s
->what
);
142 s
->parameters_fragment
.what
= mfree(s
->parameters_fragment
.what
);
143 s
->parameters_fragment
.options
= mfree(s
->parameters_fragment
.options
);
145 s
->exec_runtime
= exec_runtime_unref(s
->exec_runtime
, false);
146 exec_command_done_array(s
->exec_command
, _SWAP_EXEC_COMMAND_MAX
);
147 s
->control_command
= NULL
;
149 dynamic_creds_unref(&s
->dynamic_creds
);
151 swap_unwatch_control_pid(s
);
153 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
156 static int swap_arm_timer(Swap
*s
, usec_t usec
) {
161 if (s
->timer_event_source
) {
162 r
= sd_event_source_set_time(s
->timer_event_source
, usec
);
166 return sd_event_source_set_enabled(s
->timer_event_source
, SD_EVENT_ONESHOT
);
169 if (usec
== USEC_INFINITY
)
172 r
= sd_event_add_time(
173 UNIT(s
)->manager
->event
,
174 &s
->timer_event_source
,
177 swap_dispatch_timer
, s
);
181 (void) sd_event_source_set_description(s
->timer_event_source
, "swap-timer");
186 static int swap_add_device_dependencies(Swap
*s
) {
192 if (!s
->from_fragment
)
195 if (is_device_path(s
->what
))
196 return unit_add_node_dependency(UNIT(s
), s
->what
, MANAGER_IS_SYSTEM(UNIT(s
)->manager
), UNIT_BINDS_TO
, UNIT_DEPENDENCY_FILE
);
198 /* File based swap devices need to be ordered after
199 * systemd-remount-fs.service, since they might need a
200 * writable file system. */
201 return unit_add_dependency_by_name(UNIT(s
), UNIT_AFTER
, SPECIAL_REMOUNT_FS_SERVICE
, true, UNIT_DEPENDENCY_FILE
);
204 static int swap_add_default_dependencies(Swap
*s
) {
209 if (!UNIT(s
)->default_dependencies
)
212 if (!MANAGER_IS_SYSTEM(UNIT(s
)->manager
))
215 if (detect_container() > 0)
218 /* swap units generated for the swap dev links are missing the
219 * ordering dep against the swap target. */
220 r
= unit_add_dependency_by_name(UNIT(s
), UNIT_BEFORE
, SPECIAL_SWAP_TARGET
, true, UNIT_DEPENDENCY_DEFAULT
);
224 return unit_add_two_dependencies_by_name(UNIT(s
), UNIT_BEFORE
, UNIT_CONFLICTS
, SPECIAL_UMOUNT_TARGET
, true, UNIT_DEPENDENCY_DEFAULT
);
227 static int swap_verify(Swap
*s
) {
228 _cleanup_free_
char *e
= NULL
;
231 if (UNIT(s
)->load_state
!= UNIT_LOADED
)
234 r
= unit_name_from_path(s
->what
, ".swap", &e
);
236 return log_unit_error_errno(UNIT(s
), r
, "Failed to generate unit name from path: %m");
238 if (!unit_has_name(UNIT(s
), e
)) {
239 log_unit_error(UNIT(s
), "Value of What= and unit name do not match, not loading.");
243 if (s
->exec_context
.pam_name
&& s
->kill_context
.kill_mode
!= KILL_CONTROL_GROUP
) {
244 log_unit_error(UNIT(s
), "Unit has PAM enabled. Kill mode must be set to 'control-group'. Refusing to load.");
251 static int swap_load_devnode(Swap
*s
) {
252 _cleanup_(sd_device_unrefp
) sd_device
*d
= NULL
;
259 if (stat(s
->what
, &st
) < 0 || !S_ISBLK(st
.st_mode
))
262 r
= device_new_from_stat_rdev(&d
, &st
);
264 log_unit_full(UNIT(s
), r
== -ENOENT
? LOG_DEBUG
: LOG_WARNING
, r
,
265 "Failed to allocate device for swap %s: %m", s
->what
);
269 if (sd_device_get_devname(d
, &p
) < 0)
272 return swap_set_devnode(s
, p
);
275 static int swap_load(Unit
*u
) {
280 assert(u
->load_state
== UNIT_STUB
);
282 /* Load a .swap file */
283 if (SWAP(u
)->from_proc_swaps
)
284 r
= unit_load_fragment_and_dropin_optional(u
);
286 r
= unit_load_fragment_and_dropin(u
);
290 if (u
->load_state
== UNIT_LOADED
) {
292 if (UNIT(s
)->fragment_path
)
293 s
->from_fragment
= true;
296 if (s
->parameters_fragment
.what
)
297 s
->what
= strdup(s
->parameters_fragment
.what
);
298 else if (s
->parameters_proc_swaps
.what
)
299 s
->what
= strdup(s
->parameters_proc_swaps
.what
);
301 r
= unit_name_to_path(u
->id
, &s
->what
);
310 path_simplify(s
->what
, false);
312 if (!UNIT(s
)->description
) {
313 r
= unit_set_description(u
, s
->what
);
318 r
= unit_require_mounts_for(UNIT(s
), s
->what
, UNIT_DEPENDENCY_IMPLICIT
);
322 r
= swap_add_device_dependencies(s
);
326 r
= swap_load_devnode(s
);
330 r
= unit_patch_contexts(u
);
334 r
= unit_add_exec_dependencies(u
, &s
->exec_context
);
338 r
= unit_set_default_slice(u
);
342 r
= swap_add_default_dependencies(s
);
347 return swap_verify(s
);
350 static int swap_setup_unit(
353 const char *what_proc_swaps
,
357 _cleanup_free_
char *e
= NULL
;
365 assert(what_proc_swaps
);
367 r
= unit_name_from_path(what
, ".swap", &e
);
369 return log_unit_error_errno(u
, r
, "Failed to generate unit name from path: %m");
371 u
= manager_get_unit(m
, e
);
374 SWAP(u
)->from_proc_swaps
&&
375 !path_equal(SWAP(u
)->parameters_proc_swaps
.what
, what_proc_swaps
)) {
376 log_error("Swap %s appeared twice with different device paths %s and %s", e
, SWAP(u
)->parameters_proc_swaps
.what
, what_proc_swaps
);
383 r
= unit_new_for_name(m
, sizeof(Swap
), e
, &u
);
387 SWAP(u
)->what
= strdup(what
);
388 if (!SWAP(u
)->what
) {
393 unit_add_to_load_queue(u
);
397 p
= &SWAP(u
)->parameters_proc_swaps
;
400 p
->what
= strdup(what_proc_swaps
);
408 SWAP(u
)->is_active
= true;
409 SWAP(u
)->just_activated
= !SWAP(u
)->from_proc_swaps
;
412 SWAP(u
)->from_proc_swaps
= true;
414 p
->priority
= priority
;
416 unit_add_to_dbus_queue(u
);
420 log_unit_warning_errno(u
, r
, "Failed to load swap unit: %m");
428 static int swap_process_new(Manager
*m
, const char *device
, int prio
, bool set_flags
) {
429 _cleanup_(sd_device_unrefp
) sd_device
*d
= NULL
;
430 const char *dn
, *devlink
;
431 struct stat st
, st_link
;
436 r
= swap_setup_unit(m
, device
, device
, prio
, set_flags
);
440 /* If this is a block device, then let's add duplicates for
441 * all other names of this block device */
442 if (stat(device
, &st
) < 0 || !S_ISBLK(st
.st_mode
))
445 r
= device_new_from_stat_rdev(&d
, &st
);
447 log_full_errno(r
== -ENOENT
? LOG_DEBUG
: LOG_WARNING
, r
,
448 "Failed to allocate device for swap %s: %m", device
);
452 /* Add the main device node */
453 if (sd_device_get_devname(d
, &dn
) >= 0 && !streq(dn
, device
))
454 swap_setup_unit(m
, dn
, device
, prio
, set_flags
);
456 /* Add additional units for all symlinks */
457 FOREACH_DEVICE_DEVLINK(d
, devlink
) {
459 /* Don't bother with the /dev/block links */
460 if (streq(devlink
, device
))
463 if (path_startswith(devlink
, "/dev/block/"))
466 if (stat(devlink
, &st_link
) >= 0 &&
467 (!S_ISBLK(st_link
.st_mode
) ||
468 st_link
.st_rdev
!= st
.st_rdev
))
471 swap_setup_unit(m
, devlink
, device
, prio
, set_flags
);
477 static void swap_set_state(Swap
*s
, SwapState state
) {
483 old_state
= s
->state
;
486 if (!SWAP_STATE_WITH_PROCESS(state
)) {
487 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
488 swap_unwatch_control_pid(s
);
489 s
->control_command
= NULL
;
490 s
->control_command_id
= _SWAP_EXEC_COMMAND_INVALID
;
493 if (state
!= old_state
)
494 log_unit_debug(UNIT(s
), "Changed %s -> %s", swap_state_to_string(old_state
), swap_state_to_string(state
));
496 unit_notify(UNIT(s
), state_translation_table
[old_state
], state_translation_table
[state
], 0);
498 /* If there other units for the same device node have a job
499 queued it might be worth checking again if it is runnable
500 now. This is necessary, since swap_start() refuses
501 operation with EAGAIN if there's already another job for
502 the same device node queued. */
503 LIST_FOREACH_OTHERS(same_devnode
, other
, s
)
504 if (UNIT(other
)->job
)
505 job_add_to_run_queue(UNIT(other
)->job
);
508 static int swap_coldplug(Unit
*u
) {
510 SwapState new_state
= SWAP_DEAD
;
514 assert(s
->state
== SWAP_DEAD
);
516 if (s
->deserialized_state
!= s
->state
)
517 new_state
= s
->deserialized_state
;
518 else if (s
->from_proc_swaps
)
519 new_state
= SWAP_ACTIVE
;
521 if (new_state
== s
->state
)
524 if (s
->control_pid
> 0 &&
525 pid_is_unwaited(s
->control_pid
) &&
526 SWAP_STATE_WITH_PROCESS(new_state
)) {
528 r
= unit_watch_pid(UNIT(s
), s
->control_pid
);
532 r
= swap_arm_timer(s
, usec_add(u
->state_change_timestamp
.monotonic
, s
->timeout_usec
));
537 if (!IN_SET(new_state
, SWAP_DEAD
, SWAP_FAILED
)) {
538 (void) unit_setup_dynamic_creds(u
);
539 (void) unit_setup_exec_runtime(u
);
542 swap_set_state(s
, new_state
);
546 static void swap_dump(Unit
*u
, FILE *f
, const char *prefix
) {
547 char buf
[FORMAT_TIMESPAN_MAX
];
554 if (s
->from_proc_swaps
)
555 p
= &s
->parameters_proc_swaps
;
556 else if (s
->from_fragment
)
557 p
= &s
->parameters_fragment
;
565 "%sFrom /proc/swaps: %s\n"
566 "%sFrom fragment: %s\n",
567 prefix
, swap_state_to_string(s
->state
),
568 prefix
, swap_result_to_string(s
->result
),
570 prefix
, yes_no(s
->from_proc_swaps
),
571 prefix
, yes_no(s
->from_fragment
));
574 fprintf(f
, "%sDevice Node: %s\n", prefix
, s
->devnode
);
581 prefix
, strempty(p
->options
));
584 "%sTimeoutSec: %s\n",
585 prefix
, format_timespan(buf
, sizeof(buf
), s
->timeout_usec
, USEC_PER_SEC
));
587 if (s
->control_pid
> 0)
589 "%sControl PID: "PID_FMT
"\n",
590 prefix
, s
->control_pid
);
592 exec_context_dump(&s
->exec_context
, f
, prefix
);
593 kill_context_dump(&s
->kill_context
, f
, prefix
);
594 cgroup_context_dump(&s
->cgroup_context
, f
, prefix
);
597 static int swap_spawn(Swap
*s
, ExecCommand
*c
, pid_t
*_pid
) {
599 _cleanup_(exec_params_clear
) ExecParameters exec_params
= {
600 .flags
= EXEC_APPLY_SANDBOXING
|EXEC_APPLY_CHROOT
|EXEC_APPLY_TTY_STDIN
,
613 r
= unit_prepare_exec(UNIT(s
));
617 r
= swap_arm_timer(s
, usec_add(now(CLOCK_MONOTONIC
), s
->timeout_usec
));
621 r
= unit_set_exec_params(UNIT(s
), &exec_params
);
625 r
= exec_spawn(UNIT(s
),
635 r
= unit_watch_pid(UNIT(s
), pid
);
637 /* FIXME: we need to do something here */
645 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
650 static void swap_enter_dead(Swap
*s
, SwapResult f
) {
653 if (s
->result
== SWAP_SUCCESS
)
656 if (s
->result
== SWAP_SUCCESS
)
657 unit_log_success(UNIT(s
));
659 unit_log_failure(UNIT(s
), swap_result_to_string(s
->result
));
661 swap_set_state(s
, s
->result
!= SWAP_SUCCESS
? SWAP_FAILED
: SWAP_DEAD
);
663 s
->exec_runtime
= exec_runtime_unref(s
->exec_runtime
, true);
665 exec_context_destroy_runtime_directory(&s
->exec_context
, UNIT(s
)->manager
->prefix
[EXEC_DIRECTORY_RUNTIME
]);
667 unit_unref_uid_gid(UNIT(s
), true);
669 dynamic_creds_destroy(&s
->dynamic_creds
);
672 static void swap_enter_active(Swap
*s
, SwapResult f
) {
675 if (s
->result
== SWAP_SUCCESS
)
678 swap_set_state(s
, SWAP_ACTIVE
);
681 static void swap_enter_dead_or_active(Swap
*s
, SwapResult f
) {
684 if (s
->from_proc_swaps
)
685 swap_enter_active(s
, f
);
687 swap_enter_dead(s
, f
);
690 static void swap_enter_signal(Swap
*s
, SwapState state
, SwapResult f
) {
696 if (s
->result
== SWAP_SUCCESS
)
699 if (state
== SWAP_DEACTIVATING_SIGTERM
)
700 kop
= KILL_TERMINATE
;
704 r
= unit_kill_context(UNIT(s
), &s
->kill_context
, kop
, -1, s
->control_pid
, false);
709 r
= swap_arm_timer(s
, usec_add(now(CLOCK_MONOTONIC
), s
->timeout_usec
));
713 swap_set_state(s
, state
);
714 } else if (state
== SWAP_DEACTIVATING_SIGTERM
&& s
->kill_context
.send_sigkill
)
715 swap_enter_signal(s
, SWAP_DEACTIVATING_SIGKILL
, SWAP_SUCCESS
);
717 swap_enter_dead_or_active(s
, SWAP_SUCCESS
);
722 log_unit_warning_errno(UNIT(s
), r
, "Failed to kill processes: %m");
723 swap_enter_dead_or_active(s
, SWAP_FAILURE_RESOURCES
);
726 static void swap_enter_activating(Swap
*s
) {
727 _cleanup_free_
char *opts
= NULL
;
732 unit_warn_leftover_processes(UNIT(s
));
734 s
->control_command_id
= SWAP_EXEC_ACTIVATE
;
735 s
->control_command
= s
->exec_command
+ SWAP_EXEC_ACTIVATE
;
737 if (s
->from_fragment
) {
740 r
= fstab_find_pri(s
->parameters_fragment
.options
, &priority
);
742 log_warning_errno(r
, "Failed to parse swap priority \"%s\", ignoring: %m", s
->parameters_fragment
.options
);
743 else if (r
== 1 && s
->parameters_fragment
.priority
>= 0)
744 log_warning("Duplicate swap priority configuration by Priority and Options fields.");
746 if (r
<= 0 && s
->parameters_fragment
.priority
>= 0) {
747 if (s
->parameters_fragment
.options
)
748 r
= asprintf(&opts
, "%s,pri=%i", s
->parameters_fragment
.options
, s
->parameters_fragment
.priority
);
750 r
= asprintf(&opts
, "pri=%i", s
->parameters_fragment
.priority
);
756 r
= exec_command_set(s
->control_command
, "/sbin/swapon", NULL
);
760 if (s
->parameters_fragment
.options
|| opts
) {
761 r
= exec_command_append(s
->control_command
, "-o",
762 opts
? : s
->parameters_fragment
.options
, NULL
);
767 r
= exec_command_append(s
->control_command
, s
->what
, NULL
);
771 swap_unwatch_control_pid(s
);
773 r
= swap_spawn(s
, s
->control_command
, &s
->control_pid
);
777 swap_set_state(s
, SWAP_ACTIVATING
);
782 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'swapon' task: %m");
783 swap_enter_dead_or_active(s
, SWAP_FAILURE_RESOURCES
);
786 static void swap_enter_deactivating(Swap
*s
) {
791 s
->control_command_id
= SWAP_EXEC_DEACTIVATE
;
792 s
->control_command
= s
->exec_command
+ SWAP_EXEC_DEACTIVATE
;
794 r
= exec_command_set(s
->control_command
,
801 swap_unwatch_control_pid(s
);
803 r
= swap_spawn(s
, s
->control_command
, &s
->control_pid
);
807 swap_set_state(s
, SWAP_DEACTIVATING
);
812 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'swapoff' task: %m");
813 swap_enter_dead_or_active(s
, SWAP_FAILURE_RESOURCES
);
816 static int swap_start(Unit
*u
) {
817 Swap
*s
= SWAP(u
), *other
;
822 /* We cannot fulfill this request right now, try again later please! */
825 SWAP_DEACTIVATING_SIGTERM
,
826 SWAP_DEACTIVATING_SIGKILL
))
830 if (s
->state
== SWAP_ACTIVATING
)
833 assert(IN_SET(s
->state
, SWAP_DEAD
, SWAP_FAILED
));
835 if (detect_container() > 0)
838 /* If there's a job for another swap unit for the same node
839 * running, then let's not dispatch this one for now, and wait
840 * until that other job has finished. */
841 LIST_FOREACH_OTHERS(same_devnode
, other
, s
)
842 if (UNIT(other
)->job
&& UNIT(other
)->job
->state
== JOB_RUNNING
)
845 r
= unit_start_limit_test(u
);
847 swap_enter_dead(s
, SWAP_FAILURE_START_LIMIT_HIT
);
851 r
= unit_acquire_invocation_id(u
);
855 s
->result
= SWAP_SUCCESS
;
856 exec_command_reset_status_array(s
->exec_command
, _SWAP_EXEC_COMMAND_MAX
);
858 u
->reset_accounting
= true;
860 swap_enter_activating(s
);
864 static int swap_stop(Unit
*u
) {
871 case SWAP_DEACTIVATING
:
872 case SWAP_DEACTIVATING_SIGTERM
:
873 case SWAP_DEACTIVATING_SIGKILL
:
877 case SWAP_ACTIVATING
:
878 case SWAP_ACTIVATING_DONE
:
879 /* There's a control process pending, directly enter kill mode */
880 swap_enter_signal(s
, SWAP_DEACTIVATING_SIGTERM
, SWAP_SUCCESS
);
884 if (detect_container() > 0)
887 swap_enter_deactivating(s
);
891 assert_not_reached("Unexpected state.");
895 static int swap_serialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
902 (void) serialize_item(f
, "state", swap_state_to_string(s
->state
));
903 (void) serialize_item(f
, "result", swap_result_to_string(s
->result
));
905 if (s
->control_pid
> 0)
906 (void) serialize_item_format(f
, "control-pid", PID_FMT
, s
->control_pid
);
908 if (s
->control_command_id
>= 0)
909 (void) serialize_item(f
, "control-command", swap_exec_command_to_string(s
->control_command_id
));
914 static int swap_deserialize_item(Unit
*u
, const char *key
, const char *value
, FDSet
*fds
) {
920 if (streq(key
, "state")) {
923 state
= swap_state_from_string(value
);
925 log_unit_debug(u
, "Failed to parse state value: %s", value
);
927 s
->deserialized_state
= state
;
928 } else if (streq(key
, "result")) {
931 f
= swap_result_from_string(value
);
933 log_unit_debug(u
, "Failed to parse result value: %s", value
);
934 else if (f
!= SWAP_SUCCESS
)
936 } else if (streq(key
, "control-pid")) {
939 if (parse_pid(value
, &pid
) < 0)
940 log_unit_debug(u
, "Failed to parse control-pid value: %s", value
);
942 s
->control_pid
= pid
;
944 } else if (streq(key
, "control-command")) {
947 id
= swap_exec_command_from_string(value
);
949 log_unit_debug(u
, "Failed to parse exec-command value: %s", value
);
951 s
->control_command_id
= id
;
952 s
->control_command
= s
->exec_command
+ id
;
955 log_unit_debug(u
, "Unknown serialization key: %s", key
);
960 _pure_
static UnitActiveState
swap_active_state(Unit
*u
) {
963 return state_translation_table
[SWAP(u
)->state
];
966 _pure_
static const char *swap_sub_state_to_string(Unit
*u
) {
969 return swap_state_to_string(SWAP(u
)->state
);
972 _pure_
static bool swap_may_gc(Unit
*u
) {
977 if (s
->from_proc_swaps
)
983 static void swap_sigchld_event(Unit
*u
, pid_t pid
, int code
, int status
) {
990 if (pid
!= s
->control_pid
)
995 if (is_clean_exit(code
, status
, EXIT_CLEAN_COMMAND
, NULL
))
997 else if (code
== CLD_EXITED
)
998 f
= SWAP_FAILURE_EXIT_CODE
;
999 else if (code
== CLD_KILLED
)
1000 f
= SWAP_FAILURE_SIGNAL
;
1001 else if (code
== CLD_DUMPED
)
1002 f
= SWAP_FAILURE_CORE_DUMP
;
1004 assert_not_reached("Unknown code");
1006 if (s
->result
== SWAP_SUCCESS
)
1009 if (s
->control_command
) {
1010 exec_status_exit(&s
->control_command
->exec_status
, &s
->exec_context
, pid
, code
, status
);
1012 s
->control_command
= NULL
;
1013 s
->control_command_id
= _SWAP_EXEC_COMMAND_INVALID
;
1016 unit_log_process_exit(
1017 u
, f
== SWAP_SUCCESS
? LOG_DEBUG
: LOG_NOTICE
,
1019 swap_exec_command_to_string(s
->control_command_id
),
1024 case SWAP_ACTIVATING
:
1025 case SWAP_ACTIVATING_DONE
:
1027 if (f
== SWAP_SUCCESS
|| s
->from_proc_swaps
)
1028 swap_enter_active(s
, f
);
1030 swap_enter_dead(s
, f
);
1033 case SWAP_DEACTIVATING
:
1034 case SWAP_DEACTIVATING_SIGKILL
:
1035 case SWAP_DEACTIVATING_SIGTERM
:
1037 swap_enter_dead_or_active(s
, f
);
1041 assert_not_reached("Uh, control process died at wrong time.");
1044 /* Notify clients about changed exit status */
1045 unit_add_to_dbus_queue(u
);
1048 static int swap_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
) {
1049 Swap
*s
= SWAP(userdata
);
1052 assert(s
->timer_event_source
== source
);
1056 case SWAP_ACTIVATING
:
1057 case SWAP_ACTIVATING_DONE
:
1058 log_unit_warning(UNIT(s
), "Activation timed out. Stopping.");
1059 swap_enter_signal(s
, SWAP_DEACTIVATING_SIGTERM
, SWAP_FAILURE_TIMEOUT
);
1062 case SWAP_DEACTIVATING
:
1063 log_unit_warning(UNIT(s
), "Deactivation timed out. Stopping.");
1064 swap_enter_signal(s
, SWAP_DEACTIVATING_SIGTERM
, SWAP_FAILURE_TIMEOUT
);
1067 case SWAP_DEACTIVATING_SIGTERM
:
1068 if (s
->kill_context
.send_sigkill
) {
1069 log_unit_warning(UNIT(s
), "Swap process timed out. Killing.");
1070 swap_enter_signal(s
, SWAP_DEACTIVATING_SIGKILL
, SWAP_FAILURE_TIMEOUT
);
1072 log_unit_warning(UNIT(s
), "Swap process timed out. Skipping SIGKILL. Ignoring.");
1073 swap_enter_dead_or_active(s
, SWAP_FAILURE_TIMEOUT
);
1077 case SWAP_DEACTIVATING_SIGKILL
:
1078 log_unit_warning(UNIT(s
), "Swap process still around after SIGKILL. Ignoring.");
1079 swap_enter_dead_or_active(s
, SWAP_FAILURE_TIMEOUT
);
1083 assert_not_reached("Timeout at wrong time.");
1089 static int swap_load_proc_swaps(Manager
*m
, bool set_flags
) {
1095 rewind(m
->proc_swaps
);
1097 (void) fscanf(m
->proc_swaps
, "%*s %*s %*s %*s %*s\n");
1100 _cleanup_free_
char *dev
= NULL
, *d
= NULL
;
1103 k
= fscanf(m
->proc_swaps
,
1104 "%ms " /* device/file */
1105 "%*s " /* type of swap */
1106 "%*s " /* swap size */
1108 "%i\n", /* priority */
1114 log_warning("Failed to parse /proc/swaps:%u.", i
);
1118 if (cunescape(dev
, UNESCAPE_RELAX
, &d
) < 0)
1121 device_found_node(m
, d
, DEVICE_FOUND_SWAP
, DEVICE_FOUND_SWAP
);
1123 k
= swap_process_new(m
, d
, prio
, set_flags
);
1131 static int swap_dispatch_io(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
1132 Manager
*m
= userdata
;
1137 assert(revents
& EPOLLPRI
);
1139 r
= swap_load_proc_swaps(m
, true);
1141 log_error_errno(r
, "Failed to reread /proc/swaps: %m");
1143 /* Reset flags, just in case, for late calls */
1144 LIST_FOREACH(units_by_type
, u
, m
->units_by_type
[UNIT_SWAP
]) {
1145 Swap
*swap
= SWAP(u
);
1147 swap
->is_active
= swap
->just_activated
= false;
1153 manager_dispatch_load_queue(m
);
1155 LIST_FOREACH(units_by_type
, u
, m
->units_by_type
[UNIT_SWAP
]) {
1156 Swap
*swap
= SWAP(u
);
1158 if (!swap
->is_active
) {
1159 /* This has just been deactivated */
1161 swap_unset_proc_swaps(swap
);
1163 switch (swap
->state
) {
1166 swap_enter_dead(swap
, SWAP_SUCCESS
);
1171 swap_set_state(swap
, swap
->state
);
1176 device_found_node(m
, swap
->what
, 0, DEVICE_FOUND_SWAP
);
1178 } else if (swap
->just_activated
) {
1180 /* New swap entry */
1182 switch (swap
->state
) {
1186 (void) unit_acquire_invocation_id(UNIT(swap
));
1187 swap_enter_active(swap
, SWAP_SUCCESS
);
1190 case SWAP_ACTIVATING
:
1191 swap_set_state(swap
, SWAP_ACTIVATING_DONE
);
1195 /* Nothing really changed, but let's
1196 * issue an notification call
1197 * nonetheless, in case somebody is
1198 * waiting for this. */
1199 swap_set_state(swap
, swap
->state
);
1204 /* Reset the flags for later calls */
1205 swap
->is_active
= swap
->just_activated
= false;
1211 static Unit
*swap_following(Unit
*u
) {
1213 Swap
*other
, *first
= NULL
;
1217 /* If the user configured the swap through /etc/fstab or
1218 * a device unit, follow that. */
1220 if (s
->from_fragment
)
1223 LIST_FOREACH_OTHERS(same_devnode
, other
, s
)
1224 if (other
->from_fragment
)
1227 /* Otherwise, make everybody follow the unit that's named after
1228 * the swap device in the kernel */
1230 if (streq_ptr(s
->what
, s
->devnode
))
1233 LIST_FOREACH_AFTER(same_devnode
, other
, s
)
1234 if (streq_ptr(other
->what
, other
->devnode
))
1237 LIST_FOREACH_BEFORE(same_devnode
, other
, s
) {
1238 if (streq_ptr(other
->what
, other
->devnode
))
1244 /* Fall back to the first on the list */
1248 static int swap_following_set(Unit
*u
, Set
**_set
) {
1249 Swap
*s
= SWAP(u
), *other
;
1250 _cleanup_set_free_ Set
*set
= NULL
;
1256 if (LIST_JUST_US(same_devnode
, s
)) {
1261 set
= set_new(NULL
);
1265 LIST_FOREACH_OTHERS(same_devnode
, other
, s
) {
1266 r
= set_put(set
, other
);
1271 *_set
= TAKE_PTR(set
);
1275 static void swap_shutdown(Manager
*m
) {
1278 m
->swap_event_source
= sd_event_source_unref(m
->swap_event_source
);
1279 m
->proc_swaps
= safe_fclose(m
->proc_swaps
);
1280 m
->swaps_by_devnode
= hashmap_free(m
->swaps_by_devnode
);
1283 static void swap_enumerate(Manager
*m
) {
1288 if (!m
->proc_swaps
) {
1289 m
->proc_swaps
= fopen("/proc/swaps", "re");
1290 if (!m
->proc_swaps
) {
1291 if (errno
== ENOENT
)
1292 log_debug_errno(errno
, "Not swap enabled, skipping enumeration.");
1294 log_warning_errno(errno
, "Failed to open /proc/swaps, ignoring: %m");
1299 r
= sd_event_add_io(m
->event
, &m
->swap_event_source
, fileno(m
->proc_swaps
), EPOLLPRI
, swap_dispatch_io
, m
);
1301 log_error_errno(r
, "Failed to watch /proc/swaps: %m");
1305 /* Dispatch this before we dispatch SIGCHLD, so that
1306 * we always get the events from /proc/swaps before
1307 * the SIGCHLD of /sbin/swapon. */
1308 r
= sd_event_source_set_priority(m
->swap_event_source
, SD_EVENT_PRIORITY_NORMAL
-10);
1310 log_error_errno(r
, "Failed to change /proc/swaps priority: %m");
1314 (void) sd_event_source_set_description(m
->swap_event_source
, "swap-proc");
1317 r
= swap_load_proc_swaps(m
, false);
1327 int swap_process_device_new(Manager
*m
, sd_device
*dev
) {
1328 _cleanup_free_
char *e
= NULL
;
1329 const char *dn
, *devlink
;
1336 r
= sd_device_get_devname(dev
, &dn
);
1340 r
= unit_name_from_path(dn
, ".swap", &e
);
1344 u
= manager_get_unit(m
, e
);
1346 r
= swap_set_devnode(SWAP(u
), dn
);
1348 FOREACH_DEVICE_DEVLINK(dev
, devlink
) {
1349 _cleanup_free_
char *n
= NULL
;
1352 q
= unit_name_from_path(devlink
, ".swap", &n
);
1356 u
= manager_get_unit(m
, n
);
1358 q
= swap_set_devnode(SWAP(u
), dn
);
1367 int swap_process_device_remove(Manager
*m
, sd_device
*dev
) {
1372 r
= sd_device_get_devname(dev
, &dn
);
1376 while ((s
= hashmap_get(m
->swaps_by_devnode
, dn
))) {
1379 q
= swap_set_devnode(s
, NULL
);
1387 static void swap_reset_failed(Unit
*u
) {
1392 if (s
->state
== SWAP_FAILED
)
1393 swap_set_state(s
, SWAP_DEAD
);
1395 s
->result
= SWAP_SUCCESS
;
1398 static int swap_kill(Unit
*u
, KillWho who
, int signo
, sd_bus_error
*error
) {
1399 return unit_kill_common(u
, who
, signo
, -1, SWAP(u
)->control_pid
, error
);
1402 static int swap_get_timeout(Unit
*u
, usec_t
*timeout
) {
1407 if (!s
->timer_event_source
)
1410 r
= sd_event_source_get_time(s
->timer_event_source
, &t
);
1413 if (t
== USEC_INFINITY
)
1420 static bool swap_supported(void) {
1421 static int supported
= -1;
1423 /* If swap support is not available in the kernel, or we are
1424 * running in a container we don't support swap units, and any
1425 * attempts to starting one should fail immediately. */
1429 access("/proc/swaps", F_OK
) >= 0 &&
1430 detect_container() <= 0;
1435 static int swap_control_pid(Unit
*u
) {
1440 return s
->control_pid
;
1443 static const char* const swap_exec_command_table
[_SWAP_EXEC_COMMAND_MAX
] = {
1444 [SWAP_EXEC_ACTIVATE
] = "ExecActivate",
1445 [SWAP_EXEC_DEACTIVATE
] = "ExecDeactivate",
1448 DEFINE_STRING_TABLE_LOOKUP(swap_exec_command
, SwapExecCommand
);
1450 static const char* const swap_result_table
[_SWAP_RESULT_MAX
] = {
1451 [SWAP_SUCCESS
] = "success",
1452 [SWAP_FAILURE_RESOURCES
] = "resources",
1453 [SWAP_FAILURE_TIMEOUT
] = "timeout",
1454 [SWAP_FAILURE_EXIT_CODE
] = "exit-code",
1455 [SWAP_FAILURE_SIGNAL
] = "signal",
1456 [SWAP_FAILURE_CORE_DUMP
] = "core-dump",
1457 [SWAP_FAILURE_START_LIMIT_HIT
] = "start-limit-hit",
1460 DEFINE_STRING_TABLE_LOOKUP(swap_result
, SwapResult
);
1462 const UnitVTable swap_vtable
= {
1463 .object_size
= sizeof(Swap
),
1464 .exec_context_offset
= offsetof(Swap
, exec_context
),
1465 .cgroup_context_offset
= offsetof(Swap
, cgroup_context
),
1466 .kill_context_offset
= offsetof(Swap
, kill_context
),
1467 .exec_runtime_offset
= offsetof(Swap
, exec_runtime
),
1468 .dynamic_creds_offset
= offsetof(Swap
, dynamic_creds
),
1474 .private_section
= "Swap",
1480 .coldplug
= swap_coldplug
,
1484 .start
= swap_start
,
1489 .get_timeout
= swap_get_timeout
,
1491 .serialize
= swap_serialize
,
1492 .deserialize_item
= swap_deserialize_item
,
1494 .active_state
= swap_active_state
,
1495 .sub_state_to_string
= swap_sub_state_to_string
,
1497 .may_gc
= swap_may_gc
,
1499 .sigchld_event
= swap_sigchld_event
,
1501 .reset_failed
= swap_reset_failed
,
1503 .control_pid
= swap_control_pid
,
1505 .bus_vtable
= bus_swap_vtable
,
1506 .bus_set_property
= bus_swap_set_property
,
1507 .bus_commit_properties
= bus_swap_commit_properties
,
1509 .following
= swap_following
,
1510 .following_set
= swap_following_set
,
1512 .enumerate
= swap_enumerate
,
1513 .shutdown
= swap_shutdown
,
1514 .supported
= swap_supported
,
1516 .status_message_formats
= {
1517 .starting_stopping
= {
1518 [0] = "Activating swap %s...",
1519 [1] = "Deactivating swap %s...",
1521 .finished_start_job
= {
1522 [JOB_DONE
] = "Activated swap %s.",
1523 [JOB_FAILED
] = "Failed to activate swap %s.",
1524 [JOB_TIMEOUT
] = "Timed out activating swap %s.",
1526 .finished_stop_job
= {
1527 [JOB_DONE
] = "Deactivated swap %s.",
1528 [JOB_FAILED
] = "Failed deactivating swap %s.",
1529 [JOB_TIMEOUT
] = "Timed out deactivating swap %s.",