]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udevd: enable memory pressure/SIGRTMIN+18 logic
authorLennart Poettering <lennart@poettering.net>
Thu, 16 Feb 2023 11:30:24 +0000 (12:30 +0100)
committerLennart Poettering <lennart@poettering.net>
Wed, 1 Mar 2023 08:43:23 +0000 (09:43 +0100)
src/udev/udevd.c

index c6d24d9c362dd6fcc4a37285f6c7d9b7ba8a317a..d70fccde41e6119fdc5dcb5b628400e22f976943 100644 (file)
@@ -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();