af_xdp: change RLIMIT_MEMLOCK before load bpf program 38/37138/6
authorChen Yahui <[email protected]>
Fri, 16 Sep 2022 13:07:57 +0000 (21:07 +0800)
committerBeno�t Ganne <[email protected]>
Wed, 28 Sep 2022 08:06:01 +0000 (08:06 +0000)
default RLIMIT_MEMLOCK is 64. if we use multi af_xdp interfaces or
load complex bpf program, libbpf will return permission error.

root cause is default 64 is not large enough. So we change it before
load bpf program.

Type: fix

Change-Id: Ia6aed19c9256c498cf1155586a54a32b3f444105
Signed-off-by: Chen Yahui <[email protected]>
src/plugins/af_xdp/device.c

index a571155..cccbf69 100644 (file)
@@ -21,6 +21,7 @@
 #include <linux/ethtool.h>
 #include <linux/if_link.h>
 #include <linux/sockios.h>
+#include <linux/limits.h>
 #include <bpf/libbpf.h>
 #include <vlib/vlib.h>
 #include <vlib/unix/unix.h>
@@ -197,6 +198,12 @@ static int
 af_xdp_load_program (af_xdp_create_if_args_t * args, af_xdp_device_t * ad)
 {
   int fd;
+  struct rlimit r = { RLIM_INFINITY, RLIM_INFINITY };
+
+  if (setrlimit (RLIMIT_MEMLOCK, &r))
+    af_xdp_log (VLIB_LOG_LEVEL_WARNING, ad,
+               "setrlimit(%s) failed: %s (errno %d)", ad->linux_ifname,
+               strerror (errno), errno);
 
   ad->linux_ifindex = if_nametoindex (ad->linux_ifname);
   if (!ad->linux_ifindex)