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/>.
26 #include <sys/epoll.h>
33 #include "load-fragment.h"
34 #include "load-dropin.h"
35 #include "unit-name.h"
36 #include "dbus-swap.h"
38 #include "bus-common-errors.h"
39 #include "exit-status.h"
41 #include "path-util.h"
43 #include "udev-util.h"
44 #include "fstab-util.h"
46 static const UnitActiveState state_translation_table[_SWAP_STATE_MAX] = {
47 [SWAP_DEAD] = UNIT_INACTIVE,
48 [SWAP_ACTIVATING] = UNIT_ACTIVATING,
49 [SWAP_ACTIVATING_DONE] = UNIT_ACTIVE,
50 [SWAP_ACTIVE] = UNIT_ACTIVE,
51 [SWAP_DEACTIVATING] = UNIT_DEACTIVATING,
52 [SWAP_ACTIVATING_SIGTERM] = UNIT_DEACTIVATING,
53 [SWAP_ACTIVATING_SIGKILL] = UNIT_DEACTIVATING,
54 [SWAP_DEACTIVATING_SIGTERM] = UNIT_DEACTIVATING,
55 [SWAP_DEACTIVATING_SIGKILL] = UNIT_DEACTIVATING,
56 [SWAP_FAILED] = UNIT_FAILED
59 static int swap_dispatch_timer(sd_event_source *source, usec_t usec, void *userdata);
60 static int swap_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata);
62 static void swap_unset_proc_swaps(Swap *s) {
65 if (!s->from_proc_swaps)
68 free(s->parameters_proc_swaps.what);
69 s->parameters_proc_swaps.what = NULL;
71 s->from_proc_swaps = false;
74 static int swap_set_devnode(Swap *s, const char *devnode) {
81 r = hashmap_ensure_allocated(&UNIT(s)->manager->swaps_by_devnode, &string_hash_ops);
85 swaps = UNIT(s)->manager->swaps_by_devnode;
88 first = hashmap_get(swaps, s->devnode);
90 LIST_REMOVE(same_devnode, first, s);
92 hashmap_replace(swaps, first->devnode, first);
94 hashmap_remove(swaps, s->devnode);
101 s->devnode = strdup(devnode);
105 first = hashmap_get(swaps, s->devnode);
106 LIST_PREPEND(same_devnode, first, s);
108 return hashmap_replace(swaps, first->devnode, first);
114 static void swap_init(Unit *u) {
118 assert(UNIT(s)->load_state == UNIT_STUB);
120 s->timeout_usec = u->manager->default_timeout_start_usec;
122 s->exec_context.std_output = u->manager->default_std_output;
123 s->exec_context.std_error = u->manager->default_std_error;
125 s->parameters_proc_swaps.priority = s->parameters_fragment.priority = -1;
127 s->control_command_id = _SWAP_EXEC_COMMAND_INVALID;
129 u->ignore_on_isolate = true;
132 static void swap_unwatch_control_pid(Swap *s) {
135 if (s->control_pid <= 0)
138 unit_unwatch_pid(UNIT(s), s->control_pid);
142 static void swap_done(Unit *u) {
147 swap_unset_proc_swaps(s);
148 swap_set_devnode(s, NULL);
153 free(s->parameters_fragment.what);
154 s->parameters_fragment.what = NULL;
156 free(s->parameters_fragment.options);
157 s->parameters_fragment.options = NULL;
159 s->exec_runtime = exec_runtime_unref(s->exec_runtime);
160 exec_command_done_array(s->exec_command, _SWAP_EXEC_COMMAND_MAX);
161 s->control_command = NULL;
163 swap_unwatch_control_pid(s);
165 s->timer_event_source = sd_event_source_unref(s->timer_event_source);
168 static int swap_arm_timer(Swap *s) {
173 if (s->timeout_usec <= 0) {
174 s->timer_event_source = sd_event_source_unref(s->timer_event_source);
178 if (s->timer_event_source) {
179 r = sd_event_source_set_time(s->timer_event_source, now(CLOCK_MONOTONIC) + s->timeout_usec);
183 return sd_event_source_set_enabled(s->timer_event_source, SD_EVENT_ONESHOT);
186 return sd_event_add_time(
187 UNIT(s)->manager->event,
188 &s->timer_event_source,
190 now(CLOCK_MONOTONIC) + s->timeout_usec, 0,
191 swap_dispatch_timer, s);
194 static int swap_add_device_links(Swap *s) {
200 if (!s->from_fragment)
203 if (is_device_path(s->what))
204 return unit_add_node_link(UNIT(s), s->what, UNIT(s)->manager->running_as == SYSTEMD_SYSTEM);
206 /* File based swap devices need to be ordered after
207 * systemd-remount-fs.service, since they might need a
208 * writable file system. */
209 return unit_add_dependency_by_name(UNIT(s), UNIT_AFTER, SPECIAL_REMOUNT_FS_SERVICE, NULL, true);
212 static int swap_add_default_dependencies(Swap *s) {
215 if (UNIT(s)->manager->running_as != SYSTEMD_SYSTEM)
218 if (detect_container(NULL) > 0)
221 return unit_add_two_dependencies_by_name(UNIT(s), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, NULL, true);
224 static int swap_verify(Swap *s) {
226 _cleanup_free_ char *e = NULL;
228 if (UNIT(s)->load_state != UNIT_LOADED)
231 e = unit_name_from_path(s->what, ".swap");
235 b = unit_has_name(UNIT(s), e);
237 log_unit_error(UNIT(s)->id, "%s: Value of \"What\" and unit name do not match, not loading.", UNIT(s)->id);
241 if (s->exec_context.pam_name && s->kill_context.kill_mode != KILL_CONTROL_GROUP) {
242 log_unit_error(UNIT(s)->id, "%s has PAM enabled. Kill mode must be set to 'control-group'. Refusing to load.", UNIT(s)->id);
249 static int swap_load_devnode(Swap *s) {
250 _cleanup_udev_device_unref_ struct udev_device *d = NULL;
256 if (stat(s->what, &st) < 0 || !S_ISBLK(st.st_mode))
259 d = udev_device_new_from_devnum(UNIT(s)->manager->udev, 'b', st.st_rdev);
263 p = udev_device_get_devnode(d);
267 return swap_set_devnode(s, p);
270 static int swap_load(Unit *u) {
275 assert(u->load_state == UNIT_STUB);
277 /* Load a .swap file */
278 r = unit_load_fragment_and_dropin_optional(u);
282 if (u->load_state == UNIT_LOADED) {
284 if (UNIT(s)->fragment_path)
285 s->from_fragment = true;
288 if (s->parameters_fragment.what)
289 s->what = strdup(s->parameters_fragment.what);
290 else if (s->parameters_proc_swaps.what)
291 s->what = strdup(s->parameters_proc_swaps.what);
293 s->what = unit_name_to_path(u->id);
299 path_kill_slashes(s->what);
301 if (!UNIT(s)->description) {
302 r = unit_set_description(u, s->what);
307 r = unit_require_mounts_for(UNIT(s), s->what);
311 r = swap_add_device_links(s);
315 r = swap_load_devnode(s);
319 r = unit_patch_contexts(u);
323 r = unit_add_exec_dependencies(u, &s->exec_context);
327 r = unit_add_default_slice(u, &s->cgroup_context);
331 if (UNIT(s)->default_dependencies) {
332 r = swap_add_default_dependencies(s);
338 return swap_verify(s);
341 static int swap_add_one(
344 const char *what_proc_swaps,
348 _cleanup_free_ char *e = NULL;
356 assert(what_proc_swaps);
358 e = unit_name_from_path(what, ".swap");
362 u = manager_get_unit(m, e);
365 SWAP(u)->from_proc_swaps &&
366 !path_equal(SWAP(u)->parameters_proc_swaps.what, what_proc_swaps))
372 u = unit_new(m, sizeof(Swap));
376 r = unit_add_name(u, e);
380 SWAP(u)->what = strdup(what);
381 if (!SWAP(u)->what) {
386 unit_add_to_load_queue(u);
390 p = &SWAP(u)->parameters_proc_swaps;
393 p->what = strdup(what_proc_swaps);
401 SWAP(u)->is_active = true;
402 SWAP(u)->just_activated = !SWAP(u)->from_proc_swaps;
405 SWAP(u)->from_proc_swaps = true;
407 p->priority = priority;
409 unit_add_to_dbus_queue(u);
414 log_unit_warning_errno(e, r, "Failed to load swap unit: %m");
422 static int swap_process_new_swap(Manager *m, const char *device, int prio, bool set_flags) {
423 _cleanup_udev_device_unref_ struct udev_device *d = NULL;
424 struct udev_list_entry *item = NULL, *first = NULL;
431 r = swap_add_one(m, device, device, prio, set_flags);
435 /* If this is a block device, then let's add duplicates for
436 * all other names of this block device */
437 if (stat(device, &st) < 0 || !S_ISBLK(st.st_mode))
440 d = udev_device_new_from_devnum(m->udev, 'b', st.st_rdev);
444 /* Add the main device node */
445 dn = udev_device_get_devnode(d);
446 if (dn && !streq(dn, device))
447 swap_add_one(m, dn, device, prio, set_flags);
449 /* Add additional units for all symlinks */
450 first = udev_device_get_devlinks_list_entry(d);
451 udev_list_entry_foreach(item, first) {
454 /* Don't bother with the /dev/block links */
455 p = udev_list_entry_get_name(item);
457 if (streq(p, device))
460 if (path_startswith(p, "/dev/block/"))
463 if (stat(p, &st) >= 0)
464 if (!S_ISBLK(st.st_mode) ||
465 st.st_rdev != udev_device_get_devnum(d))
468 swap_add_one(m, p, device, prio, set_flags);
474 static void swap_set_state(Swap *s, SwapState state) {
479 old_state = s->state;
482 if (state != SWAP_ACTIVATING &&
483 state != SWAP_ACTIVATING_SIGTERM &&
484 state != SWAP_ACTIVATING_SIGKILL &&
485 state != SWAP_ACTIVATING_DONE &&
486 state != SWAP_DEACTIVATING &&
487 state != SWAP_DEACTIVATING_SIGTERM &&
488 state != SWAP_DEACTIVATING_SIGKILL) {
489 s->timer_event_source = sd_event_source_unref(s->timer_event_source);
490 swap_unwatch_control_pid(s);
491 s->control_command = NULL;
492 s->control_command_id = _SWAP_EXEC_COMMAND_INVALID;
495 if (state != old_state)
496 log_unit_debug(UNIT(s)->id,
497 "%s changed %s -> %s",
499 swap_state_to_string(old_state),
500 swap_state_to_string(state));
502 unit_notify(UNIT(s), state_translation_table[old_state], state_translation_table[state], true);
505 static int swap_coldplug(Unit *u) {
507 SwapState new_state = SWAP_DEAD;
511 assert(s->state == SWAP_DEAD);
513 if (s->deserialized_state != s->state)
514 new_state = s->deserialized_state;
515 else if (s->from_proc_swaps)
516 new_state = SWAP_ACTIVE;
518 if (new_state == s->state)
521 if (new_state == SWAP_ACTIVATING ||
522 new_state == SWAP_ACTIVATING_SIGTERM ||
523 new_state == SWAP_ACTIVATING_SIGKILL ||
524 new_state == SWAP_ACTIVATING_DONE ||
525 new_state == SWAP_DEACTIVATING ||
526 new_state == SWAP_DEACTIVATING_SIGTERM ||
527 new_state == SWAP_DEACTIVATING_SIGKILL) {
529 if (s->control_pid <= 0)
532 r = unit_watch_pid(UNIT(s), s->control_pid);
536 r = swap_arm_timer(s);
541 swap_set_state(s, new_state);
545 static void swap_dump(Unit *u, FILE *f, const char *prefix) {
552 if (s->from_proc_swaps)
553 p = &s->parameters_proc_swaps;
554 else if (s->from_fragment)
555 p = &s->parameters_fragment;
563 "%sFrom /proc/swaps: %s\n"
564 "%sFrom fragment: %s\n",
565 prefix, swap_state_to_string(s->state),
566 prefix, swap_result_to_string(s->result),
568 prefix, yes_no(s->from_proc_swaps),
569 prefix, yes_no(s->from_fragment));
572 fprintf(f, "%sDevice Node: %s\n", prefix, s->devnode);
579 prefix, strempty(p->options));
581 if (s->control_pid > 0)
583 "%sControl PID: "PID_FMT"\n",
584 prefix, s->control_pid);
586 exec_context_dump(&s->exec_context, f, prefix);
587 kill_context_dump(&s->kill_context, f, prefix);
590 static int swap_spawn(Swap *s, ExecCommand *c, pid_t *_pid) {
593 ExecParameters exec_params = {
594 .apply_permissions = true,
595 .apply_chroot = true,
596 .apply_tty_stdin = true,
603 unit_realize_cgroup(UNIT(s));
605 r = unit_setup_exec_runtime(UNIT(s));
609 r = swap_arm_timer(s);
613 exec_params.environment = UNIT(s)->manager->environment;
614 exec_params.confirm_spawn = UNIT(s)->manager->confirm_spawn;
615 exec_params.cgroup_supported = UNIT(s)->manager->cgroup_supported;
616 exec_params.cgroup_path = UNIT(s)->cgroup_path;
617 exec_params.cgroup_delegate = s->cgroup_context.delegate;
618 exec_params.runtime_prefix = manager_get_runtime_prefix(UNIT(s)->manager);
619 exec_params.unit_id = UNIT(s)->id;
629 r = unit_watch_pid(UNIT(s), pid);
631 /* FIXME: we need to do something here */
639 s->timer_event_source = sd_event_source_unref(s->timer_event_source);
643 static void swap_enter_dead(Swap *s, SwapResult f) {
646 if (f != SWAP_SUCCESS)
649 exec_runtime_destroy(s->exec_runtime);
650 s->exec_runtime = exec_runtime_unref(s->exec_runtime);
652 exec_context_destroy_runtime_directory(&s->exec_context, manager_get_runtime_prefix(UNIT(s)->manager));
654 swap_set_state(s, s->result != SWAP_SUCCESS ? SWAP_FAILED : SWAP_DEAD);
657 static void swap_enter_active(Swap *s, SwapResult f) {
660 if (f != SWAP_SUCCESS)
663 swap_set_state(s, SWAP_ACTIVE);
666 static void swap_enter_signal(Swap *s, SwapState state, SwapResult f) {
671 if (f != SWAP_SUCCESS)
674 r = unit_kill_context(
677 (state != SWAP_ACTIVATING_SIGTERM && state != SWAP_DEACTIVATING_SIGTERM) ?
678 KILL_KILL : KILL_TERMINATE,
686 r = swap_arm_timer(s);
690 swap_set_state(s, state);
691 } else if (state == SWAP_ACTIVATING_SIGTERM)
692 swap_enter_signal(s, SWAP_ACTIVATING_SIGKILL, SWAP_SUCCESS);
693 else if (state == SWAP_DEACTIVATING_SIGTERM)
694 swap_enter_signal(s, SWAP_DEACTIVATING_SIGKILL, SWAP_SUCCESS);
696 swap_enter_dead(s, SWAP_SUCCESS);
701 log_unit_warning_errno(UNIT(s)->id, r, "%s failed to kill processes: %m", UNIT(s)->id);
702 swap_enter_dead(s, SWAP_FAILURE_RESOURCES);
705 static void swap_enter_activating(Swap *s) {
706 _cleanup_free_ char *discard = NULL;
707 int r, priority = -1;
711 s->control_command_id = SWAP_EXEC_ACTIVATE;
712 s->control_command = s->exec_command + SWAP_EXEC_ACTIVATE;
714 if (s->from_fragment) {
715 fstab_filter_options(s->parameters_fragment.options, "discard\0",
716 NULL, &discard, NULL);
718 priority = s->parameters_fragment.priority;
720 fstab_find_pri(s->parameters_fragment.options, &priority);
723 r = exec_command_set(s->control_command, "/sbin/swapon", NULL);
728 char p[DECIMAL_STR_MAX(int)];
730 sprintf(p, "%i", priority);
731 r = exec_command_append(s->control_command, "-p", p, NULL);
736 if (discard && !streq(discard, "none")) {
737 const char *discard_arg;
739 if (streq(discard, "all"))
740 discard_arg = "--discard";
742 discard_arg = strappenda("--discard=", discard);
744 r = exec_command_append(s->control_command, discard_arg, NULL);
749 r = exec_command_append(s->control_command, s->what, NULL);
753 swap_unwatch_control_pid(s);
755 r = swap_spawn(s, s->control_command, &s->control_pid);
759 swap_set_state(s, SWAP_ACTIVATING);
764 log_unit_warning_errno(UNIT(s)->id, r, "%s failed to run 'swapon' task: %m", UNIT(s)->id);
765 swap_enter_dead(s, SWAP_FAILURE_RESOURCES);
768 static void swap_enter_deactivating(Swap *s) {
773 s->control_command_id = SWAP_EXEC_DEACTIVATE;
774 s->control_command = s->exec_command + SWAP_EXEC_DEACTIVATE;
776 r = exec_command_set(s->control_command,
783 swap_unwatch_control_pid(s);
785 r = swap_spawn(s, s->control_command, &s->control_pid);
789 swap_set_state(s, SWAP_DEACTIVATING);
794 log_unit_warning_errno(UNIT(s)->id, r, "%s failed to run 'swapoff' task: %m", UNIT(s)->id);
795 swap_enter_active(s, SWAP_FAILURE_RESOURCES);
798 static int swap_start(Unit *u) {
803 /* We cannot fulfill this request right now, try again later
806 if (s->state == SWAP_DEACTIVATING ||
807 s->state == SWAP_DEACTIVATING_SIGTERM ||
808 s->state == SWAP_DEACTIVATING_SIGKILL ||
809 s->state == SWAP_ACTIVATING_SIGTERM ||
810 s->state == SWAP_ACTIVATING_SIGKILL)
813 if (s->state == SWAP_ACTIVATING)
816 assert(s->state == SWAP_DEAD || s->state == SWAP_FAILED);
818 if (detect_container(NULL) > 0)
821 s->result = SWAP_SUCCESS;
822 swap_enter_activating(s);
826 static int swap_stop(Unit *u) {
831 if (s->state == SWAP_DEACTIVATING ||
832 s->state == SWAP_DEACTIVATING_SIGTERM ||
833 s->state == SWAP_DEACTIVATING_SIGKILL ||
834 s->state == SWAP_ACTIVATING_SIGTERM ||
835 s->state == SWAP_ACTIVATING_SIGKILL)
838 assert(s->state == SWAP_ACTIVATING ||
839 s->state == SWAP_ACTIVATING_DONE ||
840 s->state == SWAP_ACTIVE);
842 if (detect_container(NULL) > 0)
845 swap_enter_deactivating(s);
849 static int swap_serialize(Unit *u, FILE *f, FDSet *fds) {
856 unit_serialize_item(u, f, "state", swap_state_to_string(s->state));
857 unit_serialize_item(u, f, "result", swap_result_to_string(s->result));
859 if (s->control_pid > 0)
860 unit_serialize_item_format(u, f, "control-pid", PID_FMT, s->control_pid);
862 if (s->control_command_id >= 0)
863 unit_serialize_item(u, f, "control-command", swap_exec_command_to_string(s->control_command_id));
868 static int swap_deserialize_item(Unit *u, const char *key, const char *value, FDSet *fds) {
874 if (streq(key, "state")) {
877 state = swap_state_from_string(value);
879 log_unit_debug(u->id, "Failed to parse state value %s", value);
881 s->deserialized_state = state;
882 } else if (streq(key, "result")) {
885 f = swap_result_from_string(value);
887 log_unit_debug(u->id, "Failed to parse result value %s", value);
888 else if (f != SWAP_SUCCESS)
890 } else if (streq(key, "control-pid")) {
893 if (parse_pid(value, &pid) < 0)
894 log_unit_debug(u->id, "Failed to parse control-pid value %s", value);
896 s->control_pid = pid;
898 } else if (streq(key, "control-command")) {
901 id = swap_exec_command_from_string(value);
903 log_unit_debug(u->id, "Failed to parse exec-command value %s", value);
905 s->control_command_id = id;
906 s->control_command = s->exec_command + id;
909 log_unit_debug(u->id, "Unknown serialization key '%s'", key);
914 _pure_ static UnitActiveState swap_active_state(Unit *u) {
917 return state_translation_table[SWAP(u)->state];
920 _pure_ static const char *swap_sub_state_to_string(Unit *u) {
923 return swap_state_to_string(SWAP(u)->state);
926 _pure_ static bool swap_check_gc(Unit *u) {
931 return s->from_proc_swaps;
934 static void swap_sigchld_event(Unit *u, pid_t pid, int code, int status) {
941 if (pid != s->control_pid)
946 if (is_clean_exit(code, status, NULL))
948 else if (code == CLD_EXITED)
949 f = SWAP_FAILURE_EXIT_CODE;
950 else if (code == CLD_KILLED)
951 f = SWAP_FAILURE_SIGNAL;
952 else if (code == CLD_DUMPED)
953 f = SWAP_FAILURE_CORE_DUMP;
955 assert_not_reached("Unknown code");
957 if (f != SWAP_SUCCESS)
960 if (s->control_command) {
961 exec_status_exit(&s->control_command->exec_status, &s->exec_context, pid, code, status);
963 s->control_command = NULL;
964 s->control_command_id = _SWAP_EXEC_COMMAND_INVALID;
968 f == SWAP_SUCCESS ? LOG_DEBUG : LOG_NOTICE,
969 "%s swap process exited, code=%s status=%i",
970 u->id, sigchld_code_to_string(code), status);
974 case SWAP_ACTIVATING:
975 case SWAP_ACTIVATING_DONE:
976 case SWAP_ACTIVATING_SIGTERM:
977 case SWAP_ACTIVATING_SIGKILL:
979 if (f == SWAP_SUCCESS)
980 swap_enter_active(s, f);
982 swap_enter_dead(s, f);
985 case SWAP_DEACTIVATING:
986 case SWAP_DEACTIVATING_SIGKILL:
987 case SWAP_DEACTIVATING_SIGTERM:
989 swap_enter_dead(s, f);
993 assert_not_reached("Uh, control process died at wrong time.");
996 /* Notify clients about changed exit status */
997 unit_add_to_dbus_queue(u);
1000 static int swap_dispatch_timer(sd_event_source *source, usec_t usec, void *userdata) {
1001 Swap *s = SWAP(userdata);
1004 assert(s->timer_event_source == source);
1008 case SWAP_ACTIVATING:
1009 case SWAP_ACTIVATING_DONE:
1010 log_unit_warning(UNIT(s)->id, "%s activation timed out. Stopping.", UNIT(s)->id);
1011 swap_enter_signal(s, SWAP_ACTIVATING_SIGTERM, SWAP_FAILURE_TIMEOUT);
1014 case SWAP_DEACTIVATING:
1015 log_unit_warning(UNIT(s)->id, "%s deactivation timed out. Stopping.", UNIT(s)->id);
1016 swap_enter_signal(s, SWAP_DEACTIVATING_SIGTERM, SWAP_FAILURE_TIMEOUT);
1019 case SWAP_ACTIVATING_SIGTERM:
1020 if (s->kill_context.send_sigkill) {
1021 log_unit_warning(UNIT(s)->id, "%s activation timed out. Killing.", UNIT(s)->id);
1022 swap_enter_signal(s, SWAP_ACTIVATING_SIGKILL, SWAP_FAILURE_TIMEOUT);
1024 log_unit_warning(UNIT(s)->id, "%s activation timed out. Skipping SIGKILL. Ignoring.", UNIT(s)->id);
1025 swap_enter_dead(s, SWAP_FAILURE_TIMEOUT);
1029 case SWAP_DEACTIVATING_SIGTERM:
1030 if (s->kill_context.send_sigkill) {
1031 log_unit_warning(UNIT(s)->id, "%s deactivation timed out. Killing.", UNIT(s)->id);
1032 swap_enter_signal(s, SWAP_DEACTIVATING_SIGKILL, SWAP_FAILURE_TIMEOUT);
1034 log_unit_warning(UNIT(s)->id, "%s deactivation timed out. Skipping SIGKILL. Ignoring.", UNIT(s)->id);
1035 swap_enter_dead(s, SWAP_FAILURE_TIMEOUT);
1039 case SWAP_ACTIVATING_SIGKILL:
1040 case SWAP_DEACTIVATING_SIGKILL:
1041 log_unit_warning(UNIT(s)->id, "%s swap process still around after SIGKILL. Ignoring.", UNIT(s)->id);
1042 swap_enter_dead(s, SWAP_FAILURE_TIMEOUT);
1046 assert_not_reached("Timeout at wrong time.");
1052 static int swap_load_proc_swaps(Manager *m, bool set_flags) {
1058 rewind(m->proc_swaps);
1060 (void) fscanf(m->proc_swaps, "%*s %*s %*s %*s %*s\n");
1063 _cleanup_free_ char *dev = NULL, *d = NULL;
1066 k = fscanf(m->proc_swaps,
1067 "%ms " /* device/file */
1068 "%*s " /* type of swap */
1069 "%*s " /* swap size */
1071 "%i\n", /* priority */
1077 log_warning("Failed to parse /proc/swaps:%u", i);
1085 k = swap_process_new_swap(m, d, prio, set_flags);
1093 static int swap_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
1094 Manager *m = userdata;
1099 assert(revents & EPOLLPRI);
1101 r = swap_load_proc_swaps(m, true);
1103 log_error_errno(r, "Failed to reread /proc/swaps: %m");
1105 /* Reset flags, just in case, for late calls */
1106 LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_SWAP]) {
1107 Swap *swap = SWAP(u);
1109 swap->is_active = swap->just_activated = false;
1115 manager_dispatch_load_queue(m);
1117 LIST_FOREACH(units_by_type, u, m->units_by_type[UNIT_SWAP]) {
1118 Swap *swap = SWAP(u);
1120 if (!swap->is_active) {
1121 /* This has just been deactivated */
1123 swap_unset_proc_swaps(swap);
1125 switch (swap->state) {
1128 swap_enter_dead(swap, SWAP_SUCCESS);
1133 swap_set_state(swap, swap->state);
1137 } else if (swap->just_activated) {
1139 /* New swap entry */
1141 switch (swap->state) {
1145 swap_enter_active(swap, SWAP_SUCCESS);
1148 case SWAP_ACTIVATING:
1149 swap_set_state(swap, SWAP_ACTIVATING_DONE);
1153 /* Nothing really changed, but let's
1154 * issue an notification call
1155 * nonetheless, in case somebody is
1156 * waiting for this. */
1157 swap_set_state(swap, swap->state);
1162 /* Reset the flags for later calls */
1163 swap->is_active = swap->just_activated = false;
1169 static Unit *swap_following(Unit *u) {
1171 Swap *other, *first = NULL;
1175 /* If the user configured the swap through /etc/fstab or
1176 * a device unit, follow that. */
1178 if (s->from_fragment)
1181 LIST_FOREACH_OTHERS(same_devnode, other, s)
1182 if (other->from_fragment)
1185 /* Otherwise make everybody follow the unit that's named after
1186 * the swap device in the kernel */
1188 if (streq_ptr(s->what, s->devnode))
1191 LIST_FOREACH_AFTER(same_devnode, other, s)
1192 if (streq_ptr(other->what, other->devnode))
1195 LIST_FOREACH_BEFORE(same_devnode, other, s) {
1196 if (streq_ptr(other->what, other->devnode))
1202 /* Fall back to the first on the list */
1206 static int swap_following_set(Unit *u, Set **_set) {
1207 Swap *s = SWAP(u), *other;
1214 if (LIST_JUST_US(same_devnode, s)) {
1219 set = set_new(NULL);
1223 LIST_FOREACH_OTHERS(same_devnode, other, s) {
1224 r = set_put(set, other);
1237 static void swap_shutdown(Manager *m) {
1240 m->swap_event_source = sd_event_source_unref(m->swap_event_source);
1242 if (m->proc_swaps) {
1243 fclose(m->proc_swaps);
1244 m->proc_swaps = NULL;
1247 hashmap_free(m->swaps_by_devnode);
1248 m->swaps_by_devnode = NULL;
1251 static int swap_enumerate(Manager *m) {
1256 if (!m->proc_swaps) {
1257 m->proc_swaps = fopen("/proc/swaps", "re");
1259 return errno == ENOENT ? 0 : -errno;
1261 r = sd_event_add_io(m->event, &m->swap_event_source, fileno(m->proc_swaps), EPOLLPRI, swap_dispatch_io, m);
1265 /* Dispatch this before we dispatch SIGCHLD, so that
1266 * we always get the events from /proc/swaps before
1267 * the SIGCHLD of /sbin/swapon. */
1268 r = sd_event_source_set_priority(m->swap_event_source, -10);
1273 r = swap_load_proc_swaps(m, false);
1284 int swap_process_new_device(Manager *m, struct udev_device *dev) {
1285 struct udev_list_entry *item = NULL, *first = NULL;
1286 _cleanup_free_ char *e = NULL;
1294 dn = udev_device_get_devnode(dev);
1298 e = unit_name_from_path(dn, ".swap");
1302 s = hashmap_get(m->units, e);
1304 r = swap_set_devnode(s, dn);
1306 first = udev_device_get_devlinks_list_entry(dev);
1307 udev_list_entry_foreach(item, first) {
1308 _cleanup_free_ char *n = NULL;
1310 n = unit_name_from_path(udev_list_entry_get_name(item), ".swap");
1314 s = hashmap_get(m->units, n);
1318 q = swap_set_devnode(s, dn);
1327 int swap_process_removed_device(Manager *m, struct udev_device *dev) {
1332 dn = udev_device_get_devnode(dev);
1336 while ((s = hashmap_get(m->swaps_by_devnode, dn))) {
1339 q = swap_set_devnode(s, NULL);
1347 static void swap_reset_failed(Unit *u) {
1352 if (s->state == SWAP_FAILED)
1353 swap_set_state(s, SWAP_DEAD);
1355 s->result = SWAP_SUCCESS;
1358 static int swap_kill(Unit *u, KillWho who, int signo, sd_bus_error *error) {
1359 return unit_kill_common(u, who, signo, -1, SWAP(u)->control_pid, error);
1362 static int swap_get_timeout(Unit *u, uint64_t *timeout) {
1366 if (!s->timer_event_source)
1369 r = sd_event_source_get_time(s->timer_event_source, timeout);
1376 static bool swap_supported(Manager *m) {
1377 static int supported = -1;
1379 /* If swap support is not available in the kernel, or we are
1380 * running in a container we don't support swap units, and any
1381 * attempts to starting one should fail immediately. */
1385 access("/proc/swaps", F_OK) >= 0 &&
1386 detect_container(NULL) <= 0;
1391 static const char* const swap_state_table[_SWAP_STATE_MAX] = {
1392 [SWAP_DEAD] = "dead",
1393 [SWAP_ACTIVATING] = "activating",
1394 [SWAP_ACTIVATING_DONE] = "activating-done",
1395 [SWAP_ACTIVE] = "active",
1396 [SWAP_DEACTIVATING] = "deactivating",
1397 [SWAP_ACTIVATING_SIGTERM] = "activating-sigterm",
1398 [SWAP_ACTIVATING_SIGKILL] = "activating-sigkill",
1399 [SWAP_DEACTIVATING_SIGTERM] = "deactivating-sigterm",
1400 [SWAP_DEACTIVATING_SIGKILL] = "deactivating-sigkill",
1401 [SWAP_FAILED] = "failed"
1404 DEFINE_STRING_TABLE_LOOKUP(swap_state, SwapState);
1406 static const char* const swap_exec_command_table[_SWAP_EXEC_COMMAND_MAX] = {
1407 [SWAP_EXEC_ACTIVATE] = "ExecActivate",
1408 [SWAP_EXEC_DEACTIVATE] = "ExecDeactivate",
1411 DEFINE_STRING_TABLE_LOOKUP(swap_exec_command, SwapExecCommand);
1413 static const char* const swap_result_table[_SWAP_RESULT_MAX] = {
1414 [SWAP_SUCCESS] = "success",
1415 [SWAP_FAILURE_RESOURCES] = "resources",
1416 [SWAP_FAILURE_TIMEOUT] = "timeout",
1417 [SWAP_FAILURE_EXIT_CODE] = "exit-code",
1418 [SWAP_FAILURE_SIGNAL] = "signal",
1419 [SWAP_FAILURE_CORE_DUMP] = "core-dump"
1422 DEFINE_STRING_TABLE_LOOKUP(swap_result, SwapResult);
1424 const UnitVTable swap_vtable = {
1425 .object_size = sizeof(Swap),
1426 .exec_context_offset = offsetof(Swap, exec_context),
1427 .cgroup_context_offset = offsetof(Swap, cgroup_context),
1428 .kill_context_offset = offsetof(Swap, kill_context),
1429 .exec_runtime_offset = offsetof(Swap, exec_runtime),
1435 .private_section = "Swap",
1438 .no_instances = true,
1444 .coldplug = swap_coldplug,
1448 .start = swap_start,
1453 .get_timeout = swap_get_timeout,
1455 .serialize = swap_serialize,
1456 .deserialize_item = swap_deserialize_item,
1458 .active_state = swap_active_state,
1459 .sub_state_to_string = swap_sub_state_to_string,
1461 .check_gc = swap_check_gc,
1463 .sigchld_event = swap_sigchld_event,
1465 .reset_failed = swap_reset_failed,
1467 .bus_interface = "org.freedesktop.systemd1.Swap",
1468 .bus_vtable = bus_swap_vtable,
1469 .bus_set_property = bus_swap_set_property,
1470 .bus_commit_properties = bus_swap_commit_properties,
1472 .following = swap_following,
1473 .following_set = swap_following_set,
1475 .enumerate = swap_enumerate,
1476 .shutdown = swap_shutdown,
1477 .supported = swap_supported,
1479 .status_message_formats = {
1480 .starting_stopping = {
1481 [0] = "Activating swap %s...",
1482 [1] = "Deactivating swap %s...",
1484 .finished_start_job = {
1485 [JOB_DONE] = "Activated swap %s.",
1486 [JOB_FAILED] = "Failed to activate swap %s.",
1487 [JOB_DEPENDENCY] = "Dependency failed for %s.",
1488 [JOB_TIMEOUT] = "Timed out activating swap %s.",
1490 .finished_stop_job = {
1491 [JOB_DONE] = "Deactivated swap %s.",
1492 [JOB_FAILED] = "Failed deactivating swap %s.",
1493 [JOB_TIMEOUT] = "Timed out deactivating swap %s.",