1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2010 Lennart Poettering
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
24 #include <sys/epoll.h>
30 #include "unit-name.h"
31 #include "dbus-swap.h"
33 #include "exit-status.h"
34 #include "path-util.h"
36 #include "udev-util.h"
37 #include "fstab-util.h"
38 #include "formats-util.h"
40 static const UnitActiveState state_translation_table
[_SWAP_STATE_MAX
] = {
41 [SWAP_DEAD
] = UNIT_INACTIVE
,
42 [SWAP_ACTIVATING
] = UNIT_ACTIVATING
,
43 [SWAP_ACTIVATING_DONE
] = UNIT_ACTIVE
,
44 [SWAP_ACTIVE
] = UNIT_ACTIVE
,
45 [SWAP_DEACTIVATING
] = UNIT_DEACTIVATING
,
46 [SWAP_ACTIVATING_SIGTERM
] = UNIT_DEACTIVATING
,
47 [SWAP_ACTIVATING_SIGKILL
] = UNIT_DEACTIVATING
,
48 [SWAP_DEACTIVATING_SIGTERM
] = UNIT_DEACTIVATING
,
49 [SWAP_DEACTIVATING_SIGKILL
] = UNIT_DEACTIVATING
,
50 [SWAP_FAILED
] = UNIT_FAILED
53 static int swap_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
);
54 static int swap_dispatch_io(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
);
56 static void swap_unset_proc_swaps(Swap
*s
) {
59 if (!s
->from_proc_swaps
)
62 s
->parameters_proc_swaps
.what
= mfree(s
->parameters_proc_swaps
.what
);
64 s
->from_proc_swaps
= false;
67 static int swap_set_devnode(Swap
*s
, const char *devnode
) {
74 r
= hashmap_ensure_allocated(&UNIT(s
)->manager
->swaps_by_devnode
, &string_hash_ops
);
78 swaps
= UNIT(s
)->manager
->swaps_by_devnode
;
81 first
= hashmap_get(swaps
, s
->devnode
);
83 LIST_REMOVE(same_devnode
, first
, s
);
85 hashmap_replace(swaps
, first
->devnode
, first
);
87 hashmap_remove(swaps
, s
->devnode
);
89 s
->devnode
= mfree(s
->devnode
);
93 s
->devnode
= strdup(devnode
);
97 first
= hashmap_get(swaps
, s
->devnode
);
98 LIST_PREPEND(same_devnode
, first
, s
);
100 return hashmap_replace(swaps
, first
->devnode
, first
);
106 static void swap_init(Unit
*u
) {
110 assert(UNIT(s
)->load_state
== UNIT_STUB
);
112 s
->timeout_usec
= u
->manager
->default_timeout_start_usec
;
114 s
->exec_context
.std_output
= u
->manager
->default_std_output
;
115 s
->exec_context
.std_error
= u
->manager
->default_std_error
;
117 s
->parameters_proc_swaps
.priority
= s
->parameters_fragment
.priority
= -1;
119 s
->control_command_id
= _SWAP_EXEC_COMMAND_INVALID
;
121 u
->ignore_on_isolate
= true;
124 static void swap_unwatch_control_pid(Swap
*s
) {
127 if (s
->control_pid
<= 0)
130 unit_unwatch_pid(UNIT(s
), s
->control_pid
);
134 static void swap_done(Unit
*u
) {
139 swap_unset_proc_swaps(s
);
140 swap_set_devnode(s
, NULL
);
142 s
->what
= mfree(s
->what
);
143 s
->parameters_fragment
.what
= mfree(s
->parameters_fragment
.what
);
144 s
->parameters_fragment
.options
= mfree(s
->parameters_fragment
.options
);
146 s
->exec_runtime
= exec_runtime_unref(s
->exec_runtime
);
147 exec_command_done_array(s
->exec_command
, _SWAP_EXEC_COMMAND_MAX
);
148 s
->control_command
= NULL
;
150 swap_unwatch_control_pid(s
);
152 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
155 static int swap_arm_timer(Swap
*s
) {
160 if (s
->timeout_usec
<= 0) {
161 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
165 if (s
->timer_event_source
) {
166 r
= sd_event_source_set_time(s
->timer_event_source
, now(CLOCK_MONOTONIC
) + s
->timeout_usec
);
170 return sd_event_source_set_enabled(s
->timer_event_source
, SD_EVENT_ONESHOT
);
173 r
= sd_event_add_time(
174 UNIT(s
)->manager
->event
,
175 &s
->timer_event_source
,
177 now(CLOCK_MONOTONIC
) + s
->timeout_usec
, 0,
178 swap_dispatch_timer
, s
);
182 (void) sd_event_source_set_description(s
->timer_event_source
, "swap-timer");
187 static int swap_add_device_links(Swap
*s
) {
193 if (!s
->from_fragment
)
196 if (is_device_path(s
->what
))
197 return unit_add_node_link(UNIT(s
), s
->what
, UNIT(s
)->manager
->running_as
== MANAGER_SYSTEM
);
199 /* File based swap devices need to be ordered after
200 * systemd-remount-fs.service, since they might need a
201 * writable file system. */
202 return unit_add_dependency_by_name(UNIT(s
), UNIT_AFTER
, SPECIAL_REMOUNT_FS_SERVICE
, NULL
, true);
205 static int swap_add_default_dependencies(Swap
*s
) {
208 if (UNIT(s
)->manager
->running_as
!= MANAGER_SYSTEM
)
211 if (detect_container() > 0)
214 return unit_add_two_dependencies_by_name(UNIT(s
), UNIT_BEFORE
, UNIT_CONFLICTS
, SPECIAL_UMOUNT_TARGET
, NULL
, true);
217 static int swap_verify(Swap
*s
) {
218 _cleanup_free_
char *e
= NULL
;
221 if (UNIT(s
)->load_state
!= UNIT_LOADED
)
224 r
= unit_name_from_path(s
->what
, ".swap", &e
);
226 return log_unit_error_errno(UNIT(s
), r
, "Failed to generate unit name from path: %m");
228 if (!unit_has_name(UNIT(s
), e
)) {
229 log_unit_error(UNIT(s
), "Value of What= and unit name do not match, not loading.");
233 if (s
->exec_context
.pam_name
&& s
->kill_context
.kill_mode
!= KILL_CONTROL_GROUP
) {
234 log_unit_error(UNIT(s
), "Unit has PAM enabled. Kill mode must be set to 'control-group'. Refusing to load.");
241 static int swap_load_devnode(Swap
*s
) {
242 _cleanup_udev_device_unref_
struct udev_device
*d
= NULL
;
248 if (stat(s
->what
, &st
) < 0 || !S_ISBLK(st
.st_mode
))
251 d
= udev_device_new_from_devnum(UNIT(s
)->manager
->udev
, 'b', st
.st_rdev
);
255 p
= udev_device_get_devnode(d
);
259 return swap_set_devnode(s
, p
);
262 static int swap_load(Unit
*u
) {
267 assert(u
->load_state
== UNIT_STUB
);
269 /* Load a .swap file */
270 r
= unit_load_fragment_and_dropin_optional(u
);
274 if (u
->load_state
== UNIT_LOADED
) {
276 if (UNIT(s
)->fragment_path
)
277 s
->from_fragment
= true;
280 if (s
->parameters_fragment
.what
)
281 s
->what
= strdup(s
->parameters_fragment
.what
);
282 else if (s
->parameters_proc_swaps
.what
)
283 s
->what
= strdup(s
->parameters_proc_swaps
.what
);
285 r
= unit_name_to_path(u
->id
, &s
->what
);
294 path_kill_slashes(s
->what
);
296 if (!UNIT(s
)->description
) {
297 r
= unit_set_description(u
, s
->what
);
302 r
= unit_require_mounts_for(UNIT(s
), s
->what
);
306 r
= swap_add_device_links(s
);
310 r
= swap_load_devnode(s
);
314 r
= unit_patch_contexts(u
);
318 r
= unit_add_exec_dependencies(u
, &s
->exec_context
);
322 r
= unit_set_default_slice(u
);
326 if (UNIT(s
)->default_dependencies
) {
327 r
= swap_add_default_dependencies(s
);
333 return swap_verify(s
);
336 static int swap_setup_unit(
339 const char *what_proc_swaps
,
343 _cleanup_free_
char *e
= NULL
;
351 assert(what_proc_swaps
);
353 r
= unit_name_from_path(what
, ".swap", &e
);
355 return log_unit_error_errno(u
, r
, "Failed to generate unit name from path: %m");
357 u
= manager_get_unit(m
, e
);
360 SWAP(u
)->from_proc_swaps
&&
361 !path_equal(SWAP(u
)->parameters_proc_swaps
.what
, what_proc_swaps
)) {
362 log_error("Swap %s appeared twice with different device paths %s and %s", e
, SWAP(u
)->parameters_proc_swaps
.what
, what_proc_swaps
);
369 u
= unit_new(m
, sizeof(Swap
));
373 r
= unit_add_name(u
, e
);
377 SWAP(u
)->what
= strdup(what
);
378 if (!SWAP(u
)->what
) {
383 unit_add_to_load_queue(u
);
387 p
= &SWAP(u
)->parameters_proc_swaps
;
390 p
->what
= strdup(what_proc_swaps
);
398 SWAP(u
)->is_active
= true;
399 SWAP(u
)->just_activated
= !SWAP(u
)->from_proc_swaps
;
402 SWAP(u
)->from_proc_swaps
= true;
404 p
->priority
= priority
;
406 unit_add_to_dbus_queue(u
);
410 log_unit_warning_errno(u
, r
, "Failed to load swap unit: %m");
418 static int swap_process_new(Manager
*m
, const char *device
, int prio
, bool set_flags
) {
419 _cleanup_udev_device_unref_
struct udev_device
*d
= NULL
;
420 struct udev_list_entry
*item
= NULL
, *first
= NULL
;
427 r
= swap_setup_unit(m
, device
, device
, prio
, set_flags
);
431 /* If this is a block device, then let's add duplicates for
432 * all other names of this block device */
433 if (stat(device
, &st
) < 0 || !S_ISBLK(st
.st_mode
))
436 d
= udev_device_new_from_devnum(m
->udev
, 'b', st
.st_rdev
);
440 /* Add the main device node */
441 dn
= udev_device_get_devnode(d
);
442 if (dn
&& !streq(dn
, device
))
443 swap_setup_unit(m
, dn
, device
, prio
, set_flags
);
445 /* Add additional units for all symlinks */
446 first
= udev_device_get_devlinks_list_entry(d
);
447 udev_list_entry_foreach(item
, first
) {
450 /* Don't bother with the /dev/block links */
451 p
= udev_list_entry_get_name(item
);
453 if (streq(p
, device
))
456 if (path_startswith(p
, "/dev/block/"))
459 if (stat(p
, &st
) >= 0)
460 if (!S_ISBLK(st
.st_mode
) ||
461 st
.st_rdev
!= udev_device_get_devnum(d
))
464 swap_setup_unit(m
, p
, device
, prio
, set_flags
);
470 static void swap_set_state(Swap
*s
, SwapState state
) {
476 old_state
= s
->state
;
479 if (state
!= SWAP_ACTIVATING
&&
480 state
!= SWAP_ACTIVATING_SIGTERM
&&
481 state
!= SWAP_ACTIVATING_SIGKILL
&&
482 state
!= SWAP_ACTIVATING_DONE
&&
483 state
!= SWAP_DEACTIVATING
&&
484 state
!= SWAP_DEACTIVATING_SIGTERM
&&
485 state
!= SWAP_DEACTIVATING_SIGKILL
) {
486 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
487 swap_unwatch_control_pid(s
);
488 s
->control_command
= NULL
;
489 s
->control_command_id
= _SWAP_EXEC_COMMAND_INVALID
;
492 if (state
!= old_state
)
493 log_unit_debug(UNIT(s
), "Changed %s -> %s", swap_state_to_string(old_state
), swap_state_to_string(state
));
495 unit_notify(UNIT(s
), state_translation_table
[old_state
], state_translation_table
[state
], true);
497 /* If there other units for the same device node have a job
498 queued it might be worth checking again if it is runnable
499 now. This is necessary, since swap_start() refuses
500 operation with EAGAIN if there's already another job for
501 the same device node queued. */
502 LIST_FOREACH_OTHERS(same_devnode
, other
, s
)
503 if (UNIT(other
)->job
)
504 job_add_to_run_queue(UNIT(other
)->job
);
507 static int swap_coldplug(Unit
*u
) {
509 SwapState new_state
= SWAP_DEAD
;
513 assert(s
->state
== SWAP_DEAD
);
515 if (s
->deserialized_state
!= s
->state
)
516 new_state
= s
->deserialized_state
;
517 else if (s
->from_proc_swaps
)
518 new_state
= SWAP_ACTIVE
;
520 if (new_state
== s
->state
)
523 if (new_state
== SWAP_ACTIVATING
||
524 new_state
== SWAP_ACTIVATING_SIGTERM
||
525 new_state
== SWAP_ACTIVATING_SIGKILL
||
526 new_state
== SWAP_ACTIVATING_DONE
||
527 new_state
== SWAP_DEACTIVATING
||
528 new_state
== SWAP_DEACTIVATING_SIGTERM
||
529 new_state
== SWAP_DEACTIVATING_SIGKILL
) {
531 if (s
->control_pid
<= 0)
534 r
= unit_watch_pid(UNIT(s
), s
->control_pid
);
538 r
= swap_arm_timer(s
);
543 swap_set_state(s
, new_state
);
547 static void swap_dump(Unit
*u
, FILE *f
, const char *prefix
) {
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
));
583 if (s
->control_pid
> 0)
585 "%sControl PID: "PID_FMT
"\n",
586 prefix
, s
->control_pid
);
588 exec_context_dump(&s
->exec_context
, f
, prefix
);
589 kill_context_dump(&s
->kill_context
, f
, prefix
);
592 static int swap_spawn(Swap
*s
, ExecCommand
*c
, pid_t
*_pid
) {
595 ExecParameters exec_params
= {
596 .apply_permissions
= true,
597 .apply_chroot
= true,
598 .apply_tty_stdin
= true,
599 .bus_endpoint_fd
= -1,
606 (void) unit_realize_cgroup(UNIT(s
));
607 if (s
->reset_cpu_usage
) {
608 (void) unit_reset_cpu_usage(UNIT(s
));
609 s
->reset_cpu_usage
= false;
612 r
= unit_setup_exec_runtime(UNIT(s
));
616 r
= swap_arm_timer(s
);
620 exec_params
.environment
= UNIT(s
)->manager
->environment
;
621 exec_params
.confirm_spawn
= UNIT(s
)->manager
->confirm_spawn
;
622 exec_params
.cgroup_supported
= UNIT(s
)->manager
->cgroup_supported
;
623 exec_params
.cgroup_path
= UNIT(s
)->cgroup_path
;
624 exec_params
.cgroup_delegate
= s
->cgroup_context
.delegate
;
625 exec_params
.runtime_prefix
= manager_get_runtime_prefix(UNIT(s
)->manager
);
627 r
= exec_spawn(UNIT(s
),
636 r
= unit_watch_pid(UNIT(s
), pid
);
638 /* FIXME: we need to do something here */
646 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
650 static void swap_enter_dead(Swap
*s
, SwapResult f
) {
653 if (f
!= SWAP_SUCCESS
)
656 exec_runtime_destroy(s
->exec_runtime
);
657 s
->exec_runtime
= exec_runtime_unref(s
->exec_runtime
);
659 exec_context_destroy_runtime_directory(&s
->exec_context
, manager_get_runtime_prefix(UNIT(s
)->manager
));
661 swap_set_state(s
, s
->result
!= SWAP_SUCCESS
? SWAP_FAILED
: SWAP_DEAD
);
664 static void swap_enter_active(Swap
*s
, SwapResult f
) {
667 if (f
!= SWAP_SUCCESS
)
670 swap_set_state(s
, SWAP_ACTIVE
);
673 static void swap_enter_signal(Swap
*s
, SwapState state
, SwapResult f
) {
678 if (f
!= SWAP_SUCCESS
)
681 r
= unit_kill_context(
684 (state
!= SWAP_ACTIVATING_SIGTERM
&& state
!= SWAP_DEACTIVATING_SIGTERM
) ?
685 KILL_KILL
: KILL_TERMINATE
,
693 r
= swap_arm_timer(s
);
697 swap_set_state(s
, state
);
698 } else if (state
== SWAP_ACTIVATING_SIGTERM
)
699 swap_enter_signal(s
, SWAP_ACTIVATING_SIGKILL
, SWAP_SUCCESS
);
700 else if (state
== SWAP_DEACTIVATING_SIGTERM
)
701 swap_enter_signal(s
, SWAP_DEACTIVATING_SIGKILL
, SWAP_SUCCESS
);
703 swap_enter_dead(s
, SWAP_SUCCESS
);
708 log_unit_warning_errno(UNIT(s
), r
, "Failed to kill processes: %m");
709 swap_enter_dead(s
, SWAP_FAILURE_RESOURCES
);
712 static void swap_enter_activating(Swap
*s
) {
713 _cleanup_free_
char *opts
= NULL
;
718 s
->control_command_id
= SWAP_EXEC_ACTIVATE
;
719 s
->control_command
= s
->exec_command
+ SWAP_EXEC_ACTIVATE
;
721 if (s
->from_fragment
) {
724 r
= fstab_find_pri(s
->parameters_fragment
.options
, &priority
);
726 log_warning_errno(r
, "Failed to parse swap priority \"%s\", ignoring: %m", s
->parameters_fragment
.options
);
727 else if (r
== 1 && s
->parameters_fragment
.priority
>= 0)
728 log_warning("Duplicate swap priority configuration by Priority and Options fields.");
730 if (r
<= 0 && s
->parameters_fragment
.priority
>= 0) {
731 if (s
->parameters_fragment
.options
)
732 r
= asprintf(&opts
, "%s,pri=%i", s
->parameters_fragment
.options
, s
->parameters_fragment
.priority
);
734 r
= asprintf(&opts
, "pri=%i", s
->parameters_fragment
.priority
);
740 r
= exec_command_set(s
->control_command
, "/sbin/swapon", NULL
);
744 if (s
->parameters_fragment
.options
|| opts
) {
745 r
= exec_command_append(s
->control_command
, "-o",
746 opts
? : s
->parameters_fragment
.options
, NULL
);
751 r
= exec_command_append(s
->control_command
, s
->what
, NULL
);
755 swap_unwatch_control_pid(s
);
757 r
= swap_spawn(s
, s
->control_command
, &s
->control_pid
);
761 swap_set_state(s
, SWAP_ACTIVATING
);
766 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'swapon' task: %m");
767 swap_enter_dead(s
, SWAP_FAILURE_RESOURCES
);
770 static void swap_enter_deactivating(Swap
*s
) {
775 s
->control_command_id
= SWAP_EXEC_DEACTIVATE
;
776 s
->control_command
= s
->exec_command
+ SWAP_EXEC_DEACTIVATE
;
778 r
= exec_command_set(s
->control_command
,
785 swap_unwatch_control_pid(s
);
787 r
= swap_spawn(s
, s
->control_command
, &s
->control_pid
);
791 swap_set_state(s
, SWAP_DEACTIVATING
);
796 log_unit_warning_errno(UNIT(s
), r
, "Failed to run 'swapoff' task: %m");
797 swap_enter_active(s
, SWAP_FAILURE_RESOURCES
);
800 static int swap_start(Unit
*u
) {
801 Swap
*s
= SWAP(u
), *other
;
805 /* We cannot fulfill this request right now, try again later
808 if (s
->state
== SWAP_DEACTIVATING
||
809 s
->state
== SWAP_DEACTIVATING_SIGTERM
||
810 s
->state
== SWAP_DEACTIVATING_SIGKILL
||
811 s
->state
== SWAP_ACTIVATING_SIGTERM
||
812 s
->state
== SWAP_ACTIVATING_SIGKILL
)
815 if (s
->state
== SWAP_ACTIVATING
)
818 assert(s
->state
== SWAP_DEAD
|| s
->state
== SWAP_FAILED
);
820 if (detect_container() > 0)
823 /* If there's a job for another swap unit for the same node
824 * running, then let's not dispatch this one for now, and wait
825 * until that other job has finished. */
826 LIST_FOREACH_OTHERS(same_devnode
, other
, s
)
827 if (UNIT(other
)->job
&& UNIT(other
)->job
->state
== JOB_RUNNING
)
830 s
->result
= SWAP_SUCCESS
;
831 s
->reset_cpu_usage
= true;
833 swap_enter_activating(s
);
837 static int swap_stop(Unit
*u
) {
842 if (s
->state
== SWAP_DEACTIVATING
||
843 s
->state
== SWAP_DEACTIVATING_SIGTERM
||
844 s
->state
== SWAP_DEACTIVATING_SIGKILL
||
845 s
->state
== SWAP_ACTIVATING_SIGTERM
||
846 s
->state
== SWAP_ACTIVATING_SIGKILL
)
849 assert(s
->state
== SWAP_ACTIVATING
||
850 s
->state
== SWAP_ACTIVATING_DONE
||
851 s
->state
== SWAP_ACTIVE
);
853 if (detect_container() > 0)
856 swap_enter_deactivating(s
);
860 static int swap_serialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
867 unit_serialize_item(u
, f
, "state", swap_state_to_string(s
->state
));
868 unit_serialize_item(u
, f
, "result", swap_result_to_string(s
->result
));
870 if (s
->control_pid
> 0)
871 unit_serialize_item_format(u
, f
, "control-pid", PID_FMT
, s
->control_pid
);
873 if (s
->control_command_id
>= 0)
874 unit_serialize_item(u
, f
, "control-command", swap_exec_command_to_string(s
->control_command_id
));
879 static int swap_deserialize_item(Unit
*u
, const char *key
, const char *value
, FDSet
*fds
) {
885 if (streq(key
, "state")) {
888 state
= swap_state_from_string(value
);
890 log_unit_debug(u
, "Failed to parse state value: %s", value
);
892 s
->deserialized_state
= state
;
893 } else if (streq(key
, "result")) {
896 f
= swap_result_from_string(value
);
898 log_unit_debug(u
, "Failed to parse result value: %s", value
);
899 else if (f
!= SWAP_SUCCESS
)
901 } else if (streq(key
, "control-pid")) {
904 if (parse_pid(value
, &pid
) < 0)
905 log_unit_debug(u
, "Failed to parse control-pid value: %s", value
);
907 s
->control_pid
= pid
;
909 } else if (streq(key
, "control-command")) {
912 id
= swap_exec_command_from_string(value
);
914 log_unit_debug(u
, "Failed to parse exec-command value: %s", value
);
916 s
->control_command_id
= id
;
917 s
->control_command
= s
->exec_command
+ id
;
920 log_unit_debug(u
, "Unknown serialization key: %s", key
);
925 _pure_
static UnitActiveState
swap_active_state(Unit
*u
) {
928 return state_translation_table
[SWAP(u
)->state
];
931 _pure_
static const char *swap_sub_state_to_string(Unit
*u
) {
934 return swap_state_to_string(SWAP(u
)->state
);
937 _pure_
static bool swap_check_gc(Unit
*u
) {
942 return s
->from_proc_swaps
;
945 static void swap_sigchld_event(Unit
*u
, pid_t pid
, int code
, int status
) {
952 if (pid
!= s
->control_pid
)
957 if (is_clean_exit(code
, status
, NULL
))
959 else if (code
== CLD_EXITED
)
960 f
= SWAP_FAILURE_EXIT_CODE
;
961 else if (code
== CLD_KILLED
)
962 f
= SWAP_FAILURE_SIGNAL
;
963 else if (code
== CLD_DUMPED
)
964 f
= SWAP_FAILURE_CORE_DUMP
;
966 assert_not_reached("Unknown code");
968 if (f
!= SWAP_SUCCESS
)
971 if (s
->control_command
) {
972 exec_status_exit(&s
->control_command
->exec_status
, &s
->exec_context
, pid
, code
, status
);
974 s
->control_command
= NULL
;
975 s
->control_command_id
= _SWAP_EXEC_COMMAND_INVALID
;
978 log_unit_full(u
, f
== SWAP_SUCCESS
? LOG_DEBUG
: LOG_NOTICE
, 0,
979 "Swap process exited, code=%s status=%i", sigchld_code_to_string(code
), status
);
983 case SWAP_ACTIVATING
:
984 case SWAP_ACTIVATING_DONE
:
985 case SWAP_ACTIVATING_SIGTERM
:
986 case SWAP_ACTIVATING_SIGKILL
:
988 if (f
== SWAP_SUCCESS
)
989 swap_enter_active(s
, f
);
991 swap_enter_dead(s
, f
);
994 case SWAP_DEACTIVATING
:
995 case SWAP_DEACTIVATING_SIGKILL
:
996 case SWAP_DEACTIVATING_SIGTERM
:
998 swap_enter_dead(s
, f
);
1002 assert_not_reached("Uh, control process died at wrong time.");
1005 /* Notify clients about changed exit status */
1006 unit_add_to_dbus_queue(u
);
1009 static int swap_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
) {
1010 Swap
*s
= SWAP(userdata
);
1013 assert(s
->timer_event_source
== source
);
1017 case SWAP_ACTIVATING
:
1018 case SWAP_ACTIVATING_DONE
:
1019 log_unit_warning(UNIT(s
), "Activation timed out. Stopping.");
1020 swap_enter_signal(s
, SWAP_ACTIVATING_SIGTERM
, SWAP_FAILURE_TIMEOUT
);
1023 case SWAP_DEACTIVATING
:
1024 log_unit_warning(UNIT(s
), "Deactivation timed out. Stopping.");
1025 swap_enter_signal(s
, SWAP_DEACTIVATING_SIGTERM
, SWAP_FAILURE_TIMEOUT
);
1028 case SWAP_ACTIVATING_SIGTERM
:
1029 if (s
->kill_context
.send_sigkill
) {
1030 log_unit_warning(UNIT(s
), "Activation timed out. Killing.");
1031 swap_enter_signal(s
, SWAP_ACTIVATING_SIGKILL
, SWAP_FAILURE_TIMEOUT
);
1033 log_unit_warning(UNIT(s
), "Activation timed out. Skipping SIGKILL. Ignoring.");
1034 swap_enter_dead(s
, SWAP_FAILURE_TIMEOUT
);
1038 case SWAP_DEACTIVATING_SIGTERM
:
1039 if (s
->kill_context
.send_sigkill
) {
1040 log_unit_warning(UNIT(s
), "Deactivation timed out. Killing.");
1041 swap_enter_signal(s
, SWAP_DEACTIVATING_SIGKILL
, SWAP_FAILURE_TIMEOUT
);
1043 log_unit_warning(UNIT(s
), "Deactivation timed out. Skipping SIGKILL. Ignoring.");
1044 swap_enter_dead(s
, SWAP_FAILURE_TIMEOUT
);
1048 case SWAP_ACTIVATING_SIGKILL
:
1049 case SWAP_DEACTIVATING_SIGKILL
:
1050 log_unit_warning(UNIT(s
), "Swap process still around after SIGKILL. Ignoring.");
1051 swap_enter_dead(s
, SWAP_FAILURE_TIMEOUT
);
1055 assert_not_reached("Timeout at wrong time.");
1061 static int swap_load_proc_swaps(Manager
*m
, bool set_flags
) {
1067 rewind(m
->proc_swaps
);
1069 (void) fscanf(m
->proc_swaps
, "%*s %*s %*s %*s %*s\n");
1072 _cleanup_free_
char *dev
= NULL
, *d
= NULL
;
1075 k
= fscanf(m
->proc_swaps
,
1076 "%ms " /* device/file */
1077 "%*s " /* type of swap */
1078 "%*s " /* swap size */
1080 "%i\n", /* priority */
1086 log_warning("Failed to parse /proc/swaps:%u.", i
);
1090 if (cunescape(dev
, UNESCAPE_RELAX
, &d
) < 0)
1093 device_found_node(m
, d
, true, DEVICE_FOUND_SWAP
, set_flags
);
1095 k
= swap_process_new(m
, d
, prio
, set_flags
);
1103 static int swap_dispatch_io(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
1104 Manager
*m
= userdata
;
1109 assert(revents
& EPOLLPRI
);
1111 r
= swap_load_proc_swaps(m
, true);
1113 log_error_errno(r
, "Failed to reread /proc/swaps: %m");
1115 /* Reset flags, just in case, for late calls */
1116 LIST_FOREACH(units_by_type
, u
, m
->units_by_type
[UNIT_SWAP
]) {
1117 Swap
*swap
= SWAP(u
);
1119 swap
->is_active
= swap
->just_activated
= false;
1125 manager_dispatch_load_queue(m
);
1127 LIST_FOREACH(units_by_type
, u
, m
->units_by_type
[UNIT_SWAP
]) {
1128 Swap
*swap
= SWAP(u
);
1130 if (!swap
->is_active
) {
1131 /* This has just been deactivated */
1133 swap_unset_proc_swaps(swap
);
1135 switch (swap
->state
) {
1138 swap_enter_dead(swap
, SWAP_SUCCESS
);
1143 swap_set_state(swap
, swap
->state
);
1148 device_found_node(m
, swap
->what
, false, DEVICE_FOUND_SWAP
, true);
1150 } else if (swap
->just_activated
) {
1152 /* New swap entry */
1154 switch (swap
->state
) {
1158 swap_enter_active(swap
, SWAP_SUCCESS
);
1161 case SWAP_ACTIVATING
:
1162 swap_set_state(swap
, SWAP_ACTIVATING_DONE
);
1166 /* Nothing really changed, but let's
1167 * issue an notification call
1168 * nonetheless, in case somebody is
1169 * waiting for this. */
1170 swap_set_state(swap
, swap
->state
);
1175 /* Reset the flags for later calls */
1176 swap
->is_active
= swap
->just_activated
= false;
1182 static Unit
*swap_following(Unit
*u
) {
1184 Swap
*other
, *first
= NULL
;
1188 /* If the user configured the swap through /etc/fstab or
1189 * a device unit, follow that. */
1191 if (s
->from_fragment
)
1194 LIST_FOREACH_OTHERS(same_devnode
, other
, s
)
1195 if (other
->from_fragment
)
1198 /* Otherwise make everybody follow the unit that's named after
1199 * the swap device in the kernel */
1201 if (streq_ptr(s
->what
, s
->devnode
))
1204 LIST_FOREACH_AFTER(same_devnode
, other
, s
)
1205 if (streq_ptr(other
->what
, other
->devnode
))
1208 LIST_FOREACH_BEFORE(same_devnode
, other
, s
) {
1209 if (streq_ptr(other
->what
, other
->devnode
))
1215 /* Fall back to the first on the list */
1219 static int swap_following_set(Unit
*u
, Set
**_set
) {
1220 Swap
*s
= SWAP(u
), *other
;
1227 if (LIST_JUST_US(same_devnode
, s
)) {
1232 set
= set_new(NULL
);
1236 LIST_FOREACH_OTHERS(same_devnode
, other
, s
) {
1237 r
= set_put(set
, other
);
1250 static void swap_shutdown(Manager
*m
) {
1253 m
->swap_event_source
= sd_event_source_unref(m
->swap_event_source
);
1255 m
->proc_swaps
= safe_fclose(m
->proc_swaps
);
1257 m
->swaps_by_devnode
= hashmap_free(m
->swaps_by_devnode
);
1260 static int swap_enumerate(Manager
*m
) {
1265 if (!m
->proc_swaps
) {
1266 m
->proc_swaps
= fopen("/proc/swaps", "re");
1268 return errno
== ENOENT
? 0 : -errno
;
1270 r
= sd_event_add_io(m
->event
, &m
->swap_event_source
, fileno(m
->proc_swaps
), EPOLLPRI
, swap_dispatch_io
, m
);
1274 /* Dispatch this before we dispatch SIGCHLD, so that
1275 * we always get the events from /proc/swaps before
1276 * the SIGCHLD of /sbin/swapon. */
1277 r
= sd_event_source_set_priority(m
->swap_event_source
, -10);
1281 (void) sd_event_source_set_description(m
->swap_event_source
, "swap-proc");
1284 r
= swap_load_proc_swaps(m
, false);
1295 int swap_process_device_new(Manager
*m
, struct udev_device
*dev
) {
1296 struct udev_list_entry
*item
= NULL
, *first
= NULL
;
1297 _cleanup_free_
char *e
= NULL
;
1305 dn
= udev_device_get_devnode(dev
);
1309 r
= unit_name_from_path(dn
, ".swap", &e
);
1313 s
= hashmap_get(m
->units
, e
);
1315 r
= swap_set_devnode(s
, dn
);
1317 first
= udev_device_get_devlinks_list_entry(dev
);
1318 udev_list_entry_foreach(item
, first
) {
1319 _cleanup_free_
char *n
= NULL
;
1322 q
= unit_name_from_path(udev_list_entry_get_name(item
), ".swap", &n
);
1326 s
= hashmap_get(m
->units
, n
);
1328 q
= swap_set_devnode(s
, dn
);
1337 int swap_process_device_remove(Manager
*m
, struct udev_device
*dev
) {
1342 dn
= udev_device_get_devnode(dev
);
1346 while ((s
= hashmap_get(m
->swaps_by_devnode
, dn
))) {
1349 q
= swap_set_devnode(s
, NULL
);
1357 static void swap_reset_failed(Unit
*u
) {
1362 if (s
->state
== SWAP_FAILED
)
1363 swap_set_state(s
, SWAP_DEAD
);
1365 s
->result
= SWAP_SUCCESS
;
1368 static int swap_kill(Unit
*u
, KillWho who
, int signo
, sd_bus_error
*error
) {
1369 return unit_kill_common(u
, who
, signo
, -1, SWAP(u
)->control_pid
, error
);
1372 static int swap_get_timeout(Unit
*u
, uint64_t *timeout
) {
1376 if (!s
->timer_event_source
)
1379 r
= sd_event_source_get_time(s
->timer_event_source
, timeout
);
1386 static bool swap_supported(void) {
1387 static int supported
= -1;
1389 /* If swap support is not available in the kernel, or we are
1390 * running in a container we don't support swap units, and any
1391 * attempts to starting one should fail immediately. */
1395 access("/proc/swaps", F_OK
) >= 0 &&
1396 detect_container() <= 0;
1401 static const char* const swap_exec_command_table
[_SWAP_EXEC_COMMAND_MAX
] = {
1402 [SWAP_EXEC_ACTIVATE
] = "ExecActivate",
1403 [SWAP_EXEC_DEACTIVATE
] = "ExecDeactivate",
1406 DEFINE_STRING_TABLE_LOOKUP(swap_exec_command
, SwapExecCommand
);
1408 static const char* const swap_result_table
[_SWAP_RESULT_MAX
] = {
1409 [SWAP_SUCCESS
] = "success",
1410 [SWAP_FAILURE_RESOURCES
] = "resources",
1411 [SWAP_FAILURE_TIMEOUT
] = "timeout",
1412 [SWAP_FAILURE_EXIT_CODE
] = "exit-code",
1413 [SWAP_FAILURE_SIGNAL
] = "signal",
1414 [SWAP_FAILURE_CORE_DUMP
] = "core-dump"
1417 DEFINE_STRING_TABLE_LOOKUP(swap_result
, SwapResult
);
1419 const UnitVTable swap_vtable
= {
1420 .object_size
= sizeof(Swap
),
1421 .exec_context_offset
= offsetof(Swap
, exec_context
),
1422 .cgroup_context_offset
= offsetof(Swap
, cgroup_context
),
1423 .kill_context_offset
= offsetof(Swap
, kill_context
),
1424 .exec_runtime_offset
= offsetof(Swap
, exec_runtime
),
1430 .private_section
= "Swap",
1433 .no_instances
= true,
1439 .coldplug
= swap_coldplug
,
1443 .start
= swap_start
,
1448 .get_timeout
= swap_get_timeout
,
1450 .serialize
= swap_serialize
,
1451 .deserialize_item
= swap_deserialize_item
,
1453 .active_state
= swap_active_state
,
1454 .sub_state_to_string
= swap_sub_state_to_string
,
1456 .check_gc
= swap_check_gc
,
1458 .sigchld_event
= swap_sigchld_event
,
1460 .reset_failed
= swap_reset_failed
,
1462 .bus_vtable
= bus_swap_vtable
,
1463 .bus_set_property
= bus_swap_set_property
,
1464 .bus_commit_properties
= bus_swap_commit_properties
,
1466 .following
= swap_following
,
1467 .following_set
= swap_following_set
,
1469 .enumerate
= swap_enumerate
,
1470 .shutdown
= swap_shutdown
,
1471 .supported
= swap_supported
,
1473 .status_message_formats
= {
1474 .starting_stopping
= {
1475 [0] = "Activating swap %s...",
1476 [1] = "Deactivating swap %s...",
1478 .finished_start_job
= {
1479 [JOB_DONE
] = "Activated swap %s.",
1480 [JOB_FAILED
] = "Failed to activate swap %s.",
1481 [JOB_TIMEOUT
] = "Timed out activating swap %s.",
1483 .finished_stop_job
= {
1484 [JOB_DONE
] = "Deactivated swap %s.",
1485 [JOB_FAILED
] = "Failed deactivating swap %s.",
1486 [JOB_TIMEOUT
] = "Timed out deactivating swap %s.",