From: Lennart Poettering Date: Tue, 14 Feb 2023 15:13:59 +0000 (+0100) Subject: resolved: flush caches on memory pressure and support SIGRTMIN+18 X-Git-Tag: v254-rc1~1142^2~17 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=bb3517181b025e74c1f263e1b2d326f1e12abafb;p=thirdparty%2Fsystemd.git resolved: flush caches on memory pressure and support SIGRTMIN+18 --- diff --git a/src/resolve/resolved-manager.c b/src/resolve/resolved-manager.c index 6c6c98566f1..3d456bbc9ab 100644 --- a/src/resolve/resolved-manager.c +++ b/src/resolve/resolved-manager.c @@ -543,6 +543,30 @@ static int manager_sigrtmin1(sd_event_source *s, const struct signalfd_siginfo * return 0; } +static int manager_memory_pressure(sd_event_source *s, void *userdata) { + Manager *m = ASSERT_PTR(userdata); + + log_info("Under memory pressure, flushing caches."); + + manager_flush_caches(m, LOG_INFO); + sd_event_trim_memory(); + + return 0; +} + +static int manager_memory_pressure_listen(Manager *m) { + int r; + + assert(m); + + r = sd_event_add_memory_pressure(m->event, NULL, manager_memory_pressure, m); + if (r < 0) + log_full_errno(ERRNO_IS_NOT_SUPPORTED(r) || ERRNO_IS_PRIVILEGE(r) || (r == -EHOSTDOWN )? LOG_DEBUG : LOG_NOTICE, r, + "Failed to install memory pressure event source, ignoring: %m"); + + return 0; +} + int manager_new(Manager **ret) { _cleanup_(manager_freep) Manager *m = NULL; int r; @@ -572,6 +596,9 @@ int manager_new(Manager **ret) { .need_builtin_fallbacks = true, .etc_hosts_last = USEC_INFINITY, .read_etc_hosts = true, + + .sigrtmin18_info.memory_pressure_handler = manager_memory_pressure, + .sigrtmin18_info.memory_pressure_userdata = m, }; r = dns_trust_anchor_load(&m->trust_anchor); @@ -621,6 +648,10 @@ int manager_new(Manager **ret) { if (r < 0) return r; + r = manager_memory_pressure_listen(m); + if (r < 0) + return r; + r = manager_connect_bus(m); if (r < 0) return r; @@ -628,6 +659,7 @@ int manager_new(Manager **ret) { (void) sd_event_add_signal(m->event, &m->sigusr1_event_source, SIGUSR1, manager_sigusr1, m); (void) sd_event_add_signal(m->event, &m->sigusr2_event_source, SIGUSR2, manager_sigusr2, m); (void) sd_event_add_signal(m->event, &m->sigrtmin1_event_source, SIGRTMIN+1, manager_sigrtmin1, m); + (void) sd_event_add_signal(m->event, NULL, SIGRTMIN+18, sigrtmin18_handler, &m->sigrtmin18_info); manager_cleanup_saved_user(m); diff --git a/src/resolve/resolved-manager.h b/src/resolve/resolved-manager.h index 98d90e05b38..f8f3af6fd05 100644 --- a/src/resolve/resolved-manager.h +++ b/src/resolve/resolved-manager.h @@ -7,6 +7,7 @@ #include "sd-netlink.h" #include "sd-network.h" +#include "common-signal.h" #include "hashmap.h" #include "list.h" #include "ordered-set.h" @@ -156,6 +157,8 @@ struct Manager { LIST_HEAD(SocketGraveyard, socket_graveyard); SocketGraveyard *socket_graveyard_oldest; size_t n_socket_graveyard; + + struct sigrtmin18_info sigrtmin18_info; }; /* Manager */ diff --git a/src/resolve/resolved.c b/src/resolve/resolved.c index d3bc9027522..f9d3281509d 100644 --- a/src/resolve/resolved.c +++ b/src/resolve/resolved.c @@ -67,7 +67,7 @@ static int run(int argc, char *argv[]) { return log_error_errno(r, "Failed to drop privileges: %m"); } - assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, SIGUSR1, SIGUSR2, SIGRTMIN+1, -1) >= 0); + assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGTERM, SIGINT, SIGUSR1, SIGUSR2, SIGRTMIN+1, SIGRTMIN+18, -1) >= 0); r = manager_new(&m); if (r < 0)