X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fswap.c;h=bb1398f688da5cb8f2cee76588b7e2e05a1584f3;hb=f5b51ea7fcb0b6380c3ceb4d4f3f22f647c6fd32;hp=4fbabda568d35b0a3a8c5a44cfa79b46bbf6cfff;hpb=82a2b6bb5e4e5d294f09af778c48974a7857afb6;p=elogind.git diff --git a/src/core/swap.c b/src/core/swap.c index 4fbabda56..bb1398f68 100644 --- a/src/core/swap.c +++ b/src/core/swap.c @@ -20,24 +20,17 @@ ***/ #include -#include #include -#include #include #include -#include #include #include "unit.h" #include "swap.h" -#include "load-fragment.h" -#include "load-dropin.h" #include "unit-name.h" #include "dbus-swap.h" #include "special.h" -#include "bus-common-errors.h" #include "exit-status.h" -#include "def.h" #include "path-util.h" #include "virt.h" #include "udev-util.h" @@ -338,7 +331,7 @@ static int swap_load(Unit *u) { return swap_verify(s); } -static int swap_add_one( +static int swap_setup_unit( Manager *m, const char *what, const char *what_proc_swaps, @@ -363,8 +356,10 @@ static int swap_add_one( if (u && SWAP(u)->from_proc_swaps && - !path_equal(SWAP(u)->parameters_proc_swaps.what, what_proc_swaps)) + !path_equal(SWAP(u)->parameters_proc_swaps.what, what_proc_swaps)) { + log_error("Swap %s appeared twice with different device paths %s and %s", e, SWAP(u)->parameters_proc_swaps.what, what_proc_swaps); return -EEXIST; + } if (!u) { delete = true; @@ -379,7 +374,7 @@ static int swap_add_one( SWAP(u)->what = strdup(what); if (!SWAP(u)->what) { - r = log_oom(); + r = -ENOMEM; goto fail; } @@ -407,7 +402,6 @@ static int swap_add_one( p->priority = priority; unit_add_to_dbus_queue(u); - return 0; fail: @@ -419,7 +413,7 @@ fail: return r; } -static int swap_process_new_swap(Manager *m, const char *device, int prio, bool set_flags) { +static int swap_process_new(Manager *m, const char *device, int prio, bool set_flags) { _cleanup_udev_device_unref_ struct udev_device *d = NULL; struct udev_list_entry *item = NULL, *first = NULL; const char *dn; @@ -428,7 +422,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool assert(m); - r = swap_add_one(m, device, device, prio, set_flags); + r = swap_setup_unit(m, device, device, prio, set_flags); if (r < 0) return r; @@ -444,7 +438,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool /* Add the main device node */ dn = udev_device_get_devnode(d); if (dn && !streq(dn, device)) - swap_add_one(m, dn, device, prio, set_flags); + swap_setup_unit(m, dn, device, prio, set_flags); /* Add additional units for all symlinks */ first = udev_device_get_devlinks_list_entry(d); @@ -465,7 +459,7 @@ static int swap_process_new_swap(Manager *m, const char *device, int prio, bool st.st_rdev != udev_device_get_devnum(d)) continue; - swap_add_one(m, p, device, prio, set_flags); + swap_setup_unit(m, p, device, prio, set_flags); } return r; @@ -512,7 +506,7 @@ static void swap_set_state(Swap *s, SwapState state) { job_add_to_run_queue(UNIT(other)->job); } -static int swap_coldplug(Unit *u) { +static int swap_coldplug(Unit *u, Hashmap *deferred_work) { Swap *s = SWAP(u); SwapState new_state = SWAP_DEAD; int r; @@ -610,7 +604,11 @@ static int swap_spawn(Swap *s, ExecCommand *c, pid_t *_pid) { assert(c); assert(_pid); - unit_realize_cgroup(UNIT(s)); + (void) unit_realize_cgroup(UNIT(s)); + if (s->reset_cpu_usage) { + (void) unit_reset_cpu_usage(UNIT(s)); + s->reset_cpu_usage = false; + } r = unit_setup_exec_runtime(UNIT(s)); if (r < 0) @@ -749,7 +747,7 @@ static void swap_enter_activating(Swap *s) { if (streq(discard, "all")) discard_arg = "--discard"; else - discard_arg = strappenda("--discard=", discard); + discard_arg = strjoina("--discard=", discard); r = exec_command_append(s->control_command, discard_arg, NULL); if (r < 0) @@ -836,6 +834,8 @@ static int swap_start(Unit *u) { return -EAGAIN; s->result = SWAP_SUCCESS; + s->reset_cpu_usage = true; + swap_enter_activating(s); return 1; } @@ -1091,15 +1091,17 @@ static int swap_load_proc_swaps(Manager *m, bool set_flags) { if (k == EOF) break; - log_warning("Failed to parse /proc/swaps:%u", i); + log_warning("Failed to parse /proc/swaps:%u.", i); continue; } d = cunescape(dev); if (!d) - return -ENOMEM; + return log_oom(); - k = swap_process_new_swap(m, d, prio, set_flags); + device_found_node(m, d, true, DEVICE_FOUND_SWAP, set_flags); + + k = swap_process_new(m, d, prio, set_flags); if (k < 0) r = k; } @@ -1151,6 +1153,9 @@ static int swap_dispatch_io(sd_event_source *source, int fd, uint32_t revents, v break; } + if (swap->what) + device_found_node(m, swap->what, false, DEVICE_FOUND_SWAP, true); + } else if (swap->just_activated) { /* New swap entry */ @@ -1298,7 +1303,7 @@ fail: return r; } -int swap_process_new_device(Manager *m, struct udev_device *dev) { +int swap_process_device_new(Manager *m, struct udev_device *dev) { struct udev_list_entry *item = NULL, *first = NULL; _cleanup_free_ char *e = NULL; const char *dn; @@ -1341,7 +1346,7 @@ int swap_process_new_device(Manager *m, struct udev_device *dev) { return r; } -int swap_process_removed_device(Manager *m, struct udev_device *dev) { +int swap_process_device_remove(Manager *m, struct udev_device *dev) { const char *dn; int r = 0; Swap *s;