From: Lennart Poettering Date: Thu, 16 Feb 2023 11:30:24 +0000 (+0100) Subject: udevd: enable memory pressure/SIGRTMIN+18 logic X-Git-Tag: v254-rc1~1142^2~14 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=79d905af0a9386cddcd214dfd796576c0be1f883;p=thirdparty%2Fsystemd.git udevd: enable memory pressure/SIGRTMIN+18 logic --- diff --git a/src/udev/udevd.c b/src/udev/udevd.c index c6d24d9c362..d70fccde41e 100644 --- a/src/udev/udevd.c +++ b/src/udev/udevd.c @@ -31,6 +31,7 @@ #include "blockdev-util.h" #include "cgroup-setup.h" #include "cgroup-util.h" +#include "common-signal.h" #include "cpu-set-util.h" #include "daemon-util.h" #include "dev-setup.h" @@ -112,6 +113,9 @@ typedef struct Manager { sd_event_source *kill_workers_event; + sd_event_source *memory_pressure_event_source; + sd_event_source *sigrtmin18_event_source; + usec_t last_usec; bool udev_node_needs_cleanup; @@ -264,6 +268,9 @@ static Manager* manager_free(Manager *manager) { safe_close(manager->inotify_fd); safe_close_pair(manager->worker_watch); + sd_event_source_unref(manager->memory_pressure_event_source); + sd_event_source_unref(manager->sigrtmin18_event_source); + free(manager->cgroup); return mfree(manager); } @@ -1918,7 +1925,7 @@ static int main_loop(Manager *manager) { udev_watch_restore(manager->inotify_fd); /* block and listen to all signals on signalfd */ - assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, SIGHUP, SIGCHLD, -1) >= 0); + assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, SIGHUP, SIGCHLD, SIGRTMIN+18, -1) >= 0); r = sd_event_default(&manager->event); if (r < 0) @@ -1976,6 +1983,16 @@ static int main_loop(Manager *manager) { if (r < 0) return log_error_errno(r, "Failed to create post event source: %m"); + /* Eventually, we probably want to do more here on memory pressure, for example, kill idle workers immediately */ + r = sd_event_add_memory_pressure(manager->event, &manager->memory_pressure_event_source, NULL, NULL); + if (r < 0) + log_full_errno(ERRNO_IS_NOT_SUPPORTED(r) || ERRNO_IS_PRIVILEGE(r) || (r == -EHOSTDOWN) ? LOG_DEBUG : LOG_WARNING, r, + "Failed to allocate memory pressure watch, ignoring: %m"); + + r = sd_event_add_signal(manager->event, &manager->memory_pressure_event_source, SIGRTMIN+18, sigrtmin18_handler, NULL); + if (r < 0) + return log_error_errno(r, "Failed to allocate SIGRTMIN+18 event source, ignoring: %m"); + manager->last_usec = now(CLOCK_MONOTONIC); udev_builtin_init();