From 79d905af0a9386cddcd214dfd796576c0be1f883 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 16 Feb 2023 12:30:24 +0100 Subject: [PATCH] udevd: enable memory pressure/SIGRTMIN+18 logic --- src/udev/udevd.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) 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(); -- 2.47.3