diff options
author | Maciej Fijalkowski <maciejromanfijalkowski@gmail.com> | 2019-02-01 16:42:26 -0500 |
---|---|---|
committer | Daniel Borkmann <daniel@iogearbox.net> | 2019-02-01 17:37:51 -0500 |
commit | 6a5457618f62147aeac706d26ff28e0e57a324e3 (patch) | |
tree | 245cfdab823957b6dcdc0cdf2ad8432be72d9857 /samples | |
parent | bbaf6029c49ccf2dc93d9564af58a20d125947a1 (diff) |
samples/bpf: Extend RLIMIT_MEMLOCK for xdp_{sample_pkts, router_ipv4}
There is a common problem with xdp samples that happens when user wants
to run a particular sample and some bpf program is already loaded. The
default 64kb RLIMIT_MEMLOCK resource limit will cause a following error
(assuming that xdp sample that is failing was converted to libbpf
usage):
libbpf: Error in bpf_object__probe_name():Operation not permitted(1).
Couldn't load basic 'r0 = 0' BPF program.
libbpf: failed to load object './xdp_sample_pkts_kern.o'
Fix it in xdp_sample_pkts and xdp_router_ipv4 by setting RLIMIT_MEMLOCK
to RLIM_INFINITY.
Signed-off-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Acked-by: Jesper Dangaard Brouer <brouer@redhat.com>
Acked-by: John Fastabend <john.fastabend@gmail.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Diffstat (limited to 'samples')
-rw-r--r-- | samples/bpf/xdp_router_ipv4_user.c | 7 | ||||
-rw-r--r-- | samples/bpf/xdp_sample_pkts_user.c | 7 |
2 files changed, 14 insertions, 0 deletions
diff --git a/samples/bpf/xdp_router_ipv4_user.c b/samples/bpf/xdp_router_ipv4_user.c index cea2306f5ab7..c63c6beec7d6 100644 --- a/samples/bpf/xdp_router_ipv4_user.c +++ b/samples/bpf/xdp_router_ipv4_user.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <sys/syscall.h> | 25 | #include <sys/syscall.h> |
26 | #include "bpf_util.h" | 26 | #include "bpf_util.h" |
27 | #include "bpf/libbpf.h" | 27 | #include "bpf/libbpf.h" |
28 | #include <sys/resource.h> | ||
28 | 29 | ||
29 | int sock, sock_arp, flags = 0; | 30 | int sock, sock_arp, flags = 0; |
30 | static int total_ifindex; | 31 | static int total_ifindex; |
@@ -609,6 +610,7 @@ cleanup: | |||
609 | 610 | ||
610 | int main(int ac, char **argv) | 611 | int main(int ac, char **argv) |
611 | { | 612 | { |
613 | struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY}; | ||
612 | struct bpf_prog_load_attr prog_load_attr = { | 614 | struct bpf_prog_load_attr prog_load_attr = { |
613 | .prog_type = BPF_PROG_TYPE_XDP, | 615 | .prog_type = BPF_PROG_TYPE_XDP, |
614 | }; | 616 | }; |
@@ -635,6 +637,11 @@ int main(int ac, char **argv) | |||
635 | ifname_list = (argv + 1); | 637 | ifname_list = (argv + 1); |
636 | } | 638 | } |
637 | 639 | ||
640 | if (setrlimit(RLIMIT_MEMLOCK, &r)) { | ||
641 | perror("setrlimit(RLIMIT_MEMLOCK)"); | ||
642 | return 1; | ||
643 | } | ||
644 | |||
638 | if (bpf_prog_load_xattr(&prog_load_attr, &obj, &prog_fd)) | 645 | if (bpf_prog_load_xattr(&prog_load_attr, &obj, &prog_fd)) |
639 | return 1; | 646 | return 1; |
640 | 647 | ||
diff --git a/samples/bpf/xdp_sample_pkts_user.c b/samples/bpf/xdp_sample_pkts_user.c index 8dd87c1eb560..5f5828ee0761 100644 --- a/samples/bpf/xdp_sample_pkts_user.c +++ b/samples/bpf/xdp_sample_pkts_user.c | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <signal.h> | 12 | #include <signal.h> |
13 | #include <libbpf.h> | 13 | #include <libbpf.h> |
14 | #include <bpf/bpf.h> | 14 | #include <bpf/bpf.h> |
15 | #include <sys/resource.h> | ||
15 | 16 | ||
16 | #include "perf-sys.h" | 17 | #include "perf-sys.h" |
17 | #include "trace_helpers.h" | 18 | #include "trace_helpers.h" |
@@ -99,6 +100,7 @@ static void sig_handler(int signo) | |||
99 | 100 | ||
100 | int main(int argc, char **argv) | 101 | int main(int argc, char **argv) |
101 | { | 102 | { |
103 | struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY}; | ||
102 | struct bpf_prog_load_attr prog_load_attr = { | 104 | struct bpf_prog_load_attr prog_load_attr = { |
103 | .prog_type = BPF_PROG_TYPE_XDP, | 105 | .prog_type = BPF_PROG_TYPE_XDP, |
104 | }; | 106 | }; |
@@ -114,6 +116,11 @@ int main(int argc, char **argv) | |||
114 | return 1; | 116 | return 1; |
115 | } | 117 | } |
116 | 118 | ||
119 | if (setrlimit(RLIMIT_MEMLOCK, &r)) { | ||
120 | perror("setrlimit(RLIMIT_MEMLOCK)"); | ||
121 | return 1; | ||
122 | } | ||
123 | |||
117 | numcpus = get_nprocs(); | 124 | numcpus = get_nprocs(); |
118 | if (numcpus > MAX_CPUS) | 125 | if (numcpus > MAX_CPUS) |
119 | numcpus = MAX_CPUS; | 126 | numcpus = MAX_CPUS; |