summaryrefslogtreecommitdiff
path: root/src/resolve
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2023-02-14 16:13:59 +0100
committerLennart Poettering <lennart@poettering.net>2023-03-01 09:43:23 +0100
commitbb3517181b025e74c1f263e1b2d326f1e12abafb (patch)
tree0f4640b43fad5a5a62b5ac2466afe261588aa7f9 /src/resolve
parent9b2c161481573cea6d0f478576b7b854d76ebe02 (diff)
downloadsystemd-bb3517181b025e74c1f263e1b2d326f1e12abafb.tar.gz
resolved: flush caches on memory pressure and support SIGRTMIN+18
Diffstat (limited to 'src/resolve')
-rw-r--r--src/resolve/resolved-manager.c32
-rw-r--r--src/resolve/resolved-manager.h3
-rw-r--r--src/resolve/resolved.c2
3 files changed, 36 insertions, 1 deletions
diff --git a/src/resolve/resolved-manager.c b/src/resolve/resolved-manager.c
index 6c6c98566f..3d456bbc9a 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 98d90e05b3..f8f3af6fd0 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 d3bc902752..f9d3281509 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)