]> git.ipfire.org Git - thirdparty/knot-dns.git/commitdiff
knotd: reduce required RLIMIT_MEMLOCK value
authorDaniel Salzman <daniel.salzman@nic.cz>
Tue, 2 Feb 2021 10:15:51 +0000 (11:15 +0100)
committerDaniel Salzman <daniel.salzman@nic.cz>
Tue, 2 Feb 2021 18:19:41 +0000 (19:19 +0100)
src/knot/server/server.c

index b4bf25d9790a59ffb87902550088c8b57a18d71c..bc7707c619be2ca2f540bbb68e3acc6e6a5c952f 100644 (file)
@@ -486,15 +486,22 @@ static int configure_sockets(conf_t *conf, server_t *s)
        conf_val_t lisxdp_val = conf_get(conf, C_SRV, C_LISTEN_XDP);
        conf_val_t rundir_val = conf_get(conf, C_SRV, C_RUNDIR);
 
+#ifdef ENABLE_XDP
        if (lisxdp_val.code == KNOT_EOK) {
-               struct rlimit no_limit = { RLIM_INFINITY, RLIM_INFINITY };
-               int ret = setrlimit(RLIMIT_MEMLOCK, &no_limit);
-               if (ret != 0) {
-                       log_error("failed to increase RLIMIT_MEMLOCK (%s)",
-                                 knot_strerror(errno));
-                       return KNOT_ESYSTEM;
+               struct rlimit min_limit = { KNOT_XDP_MIN_MEMLOCK, KNOT_XDP_MIN_MEMLOCK };
+               struct rlimit cur_limit = { 0 };
+               if (getrlimit(RLIMIT_MEMLOCK, &cur_limit) != 0 ||
+                   cur_limit.rlim_cur < min_limit.rlim_cur ||
+                   cur_limit.rlim_max < min_limit.rlim_max) {
+                       int ret = setrlimit(RLIMIT_MEMLOCK, &min_limit);
+                       if (ret != 0) {
+                               log_error("failed to increase RLIMIT_MEMLOCK (%s)",
+                                         knot_strerror(errno));
+                               return KNOT_ESYSTEM;
+                       }
                }
        }
+#endif
 
        size_t real_nifs = 0;
        size_t nifs = conf_val_count(&listen_val) + conf_val_count(&lisxdp_val);