X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fswap.c;h=6b1bdb5c1e49d283e43f8903becbb32c23d5e984;hb=340a1d2330ddc1dd18ad75bcdddf32f63c84b4a1;hp=f73a8e6debb2de0657a2e4f60b79a75a38775996;hpb=2eec67acbb00593e414549a7e5b35eb7dd776b1b;p=elogind.git diff --git a/src/core/swap.c b/src/core/swap.c index f73a8e6de..6b1bdb5c1 100644 --- a/src/core/swap.c +++ b/src/core/swap.c @@ -331,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, @@ -356,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; @@ -372,7 +374,7 @@ static int swap_add_one( SWAP(u)->what = strdup(what); if (!SWAP(u)->what) { - r = log_oom(); + r = -ENOMEM; goto fail; } @@ -400,7 +402,6 @@ static int swap_add_one( p->priority = priority; unit_add_to_dbus_queue(u); - return 0; fail: @@ -412,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; @@ -421,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; @@ -437,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); @@ -458,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; @@ -505,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; @@ -603,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) @@ -719,8 +724,12 @@ static void swap_enter_activating(Swap *s) { NULL, &discard, NULL); priority = s->parameters_fragment.priority; - if (priority < 0) - fstab_find_pri(s->parameters_fragment.options, &priority); + if (priority < 0) { + r = fstab_find_pri(s->parameters_fragment.options, &priority); + if (r < 0) + log_notice_errno(r, "Failed to parse swap priority \"%s\", ignoring: %m", + s->parameters_fragment.options); + } } r = exec_command_set(s->control_command, "/sbin/swapon", NULL); @@ -829,6 +838,8 @@ static int swap_start(Unit *u) { return -EAGAIN; s->result = SWAP_SUCCESS; + s->reset_cpu_usage = true; + swap_enter_activating(s); return 1; } @@ -1084,15 +1095,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; } @@ -1144,6 +1157,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 */ @@ -1291,7 +1307,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; @@ -1334,7 +1350,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;