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);