Message ID | 20201009160353.1529-4-danieltimlee@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | BPF |
Headers | show |
Series | samples: bpf: Refactor XDP programs with libbpf | expand |
On Fri, Oct 9, 2020 at 9:04 AM Daniel T. Lee <danieltimlee@gmail.com> wrote: > > Most of the samples were converted to use the new BTF-defined MAP as > they moved to libbpf, but some of the samples were missing. > > Instead of using the previous BPF MAP definition, this commit refactors > xdp_monitor and xdp_sample_pkts_kern MAP definition with the new > BTF-defined MAP format. > > Also, this commit removes the max_entries attribute at PERF_EVENT_ARRAY > map type. The libbpf's bpf_object__create_map() will automatically > set max_entries to the maximum configured number of CPUs on the host. > > Signed-off-by: Daniel T. Lee <danieltimlee@gmail.com> > --- > samples/bpf/xdp_monitor_kern.c | 60 +++++++++++++++--------------- > samples/bpf/xdp_sample_pkts_kern.c | 14 +++---- > samples/bpf/xdp_sample_pkts_user.c | 1 - > 3 files changed, 36 insertions(+), 39 deletions(-) > [...] > --- a/samples/bpf/xdp_sample_pkts_kern.c > +++ b/samples/bpf/xdp_sample_pkts_kern.c > @@ -5,14 +5,12 @@ > #include <bpf/bpf_helpers.h> > > #define SAMPLE_SIZE 64ul > -#define MAX_CPUS 128 > - > -struct bpf_map_def SEC("maps") my_map = { > - .type = BPF_MAP_TYPE_PERF_EVENT_ARRAY, > - .key_size = sizeof(int), > - .value_size = sizeof(u32), > - .max_entries = MAX_CPUS, > -}; > + > +struct { > + __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); > + __type(key, int); > + __type(value, u32); this actually will generate unnecessary libbpf warnings, because PERF_EVENT_ARRAY doesn't support BTF types for key/value. So use __uint(key_size, sizeof(int)) and __uint(value_size, sizeof(u32)) instead. > +} my_map SEC(".maps"); > > SEC("xdp_sample") > int xdp_sample_prog(struct xdp_md *ctx) > diff --git a/samples/bpf/xdp_sample_pkts_user.c b/samples/bpf/xdp_sample_pkts_user.c > index 991ef6f0880b..4b2a300c750c 100644 > --- a/samples/bpf/xdp_sample_pkts_user.c > +++ b/samples/bpf/xdp_sample_pkts_user.c > @@ -18,7 +18,6 @@ > > #include "perf-sys.h" > > -#define MAX_CPUS 128 > static int if_idx; > static char *if_name; > static __u32 xdp_flags = XDP_FLAGS_UPDATE_IF_NOEXIST; > -- > 2.25.1 >
On Sat, Oct 10, 2020 at 3:25 AM Andrii Nakryiko <andrii.nakryiko@gmail.com> wrote: > > On Fri, Oct 9, 2020 at 9:04 AM Daniel T. Lee <danieltimlee@gmail.com> wrote: > > > > Most of the samples were converted to use the new BTF-defined MAP as > > they moved to libbpf, but some of the samples were missing. > > > > Instead of using the previous BPF MAP definition, this commit refactors > > xdp_monitor and xdp_sample_pkts_kern MAP definition with the new > > BTF-defined MAP format. > > > > Also, this commit removes the max_entries attribute at PERF_EVENT_ARRAY > > map type. The libbpf's bpf_object__create_map() will automatically > > set max_entries to the maximum configured number of CPUs on the host. > > > > Signed-off-by: Daniel T. Lee <danieltimlee@gmail.com> > > --- > > samples/bpf/xdp_monitor_kern.c | 60 +++++++++++++++--------------- > > samples/bpf/xdp_sample_pkts_kern.c | 14 +++---- > > samples/bpf/xdp_sample_pkts_user.c | 1 - > > 3 files changed, 36 insertions(+), 39 deletions(-) > > > > [...] > > > --- a/samples/bpf/xdp_sample_pkts_kern.c > > +++ b/samples/bpf/xdp_sample_pkts_kern.c > > @@ -5,14 +5,12 @@ > > #include <bpf/bpf_helpers.h> > > > > #define SAMPLE_SIZE 64ul > > -#define MAX_CPUS 128 > > - > > -struct bpf_map_def SEC("maps") my_map = { > > - .type = BPF_MAP_TYPE_PERF_EVENT_ARRAY, > > - .key_size = sizeof(int), > > - .value_size = sizeof(u32), > > - .max_entries = MAX_CPUS, > > -}; > > + > > +struct { > > + __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); > > + __type(key, int); > > + __type(value, u32); > > > this actually will generate unnecessary libbpf warnings, because > PERF_EVENT_ARRAY doesn't support BTF types for key/value. So use > __uint(key_size, sizeof(int)) and __uint(value_size, sizeof(u32)) > instead. > Thanks for the great review! I'll fix it right away and send the next version of patch. > > +} my_map SEC(".maps"); > > > > SEC("xdp_sample") > > int xdp_sample_prog(struct xdp_md *ctx) > > diff --git a/samples/bpf/xdp_sample_pkts_user.c b/samples/bpf/xdp_sample_pkts_user.c > > index 991ef6f0880b..4b2a300c750c 100644 > > --- a/samples/bpf/xdp_sample_pkts_user.c > > +++ b/samples/bpf/xdp_sample_pkts_user.c > > @@ -18,7 +18,6 @@ > > > > #include "perf-sys.h" > > > > -#define MAX_CPUS 128 > > static int if_idx; > > static char *if_name; > > static __u32 xdp_flags = XDP_FLAGS_UPDATE_IF_NOEXIST; > > -- > > 2.25.1 > >
diff --git a/samples/bpf/xdp_monitor_kern.c b/samples/bpf/xdp_monitor_kern.c index 3d33cca2d48a..5c955b812c47 100644 --- a/samples/bpf/xdp_monitor_kern.c +++ b/samples/bpf/xdp_monitor_kern.c @@ -6,21 +6,21 @@ #include <uapi/linux/bpf.h> #include <bpf/bpf_helpers.h> -struct bpf_map_def SEC("maps") redirect_err_cnt = { - .type = BPF_MAP_TYPE_PERCPU_ARRAY, - .key_size = sizeof(u32), - .value_size = sizeof(u64), - .max_entries = 2, +struct { + __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); + __type(key, u32); + __type(value, u64); + __uint(max_entries, 2); /* TODO: have entries for all possible errno's */ -}; +} redirect_err_cnt SEC(".maps"); #define XDP_UNKNOWN XDP_REDIRECT + 1 -struct bpf_map_def SEC("maps") exception_cnt = { - .type = BPF_MAP_TYPE_PERCPU_ARRAY, - .key_size = sizeof(u32), - .value_size = sizeof(u64), - .max_entries = XDP_UNKNOWN + 1, -}; +struct { + __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); + __type(key, u32); + __type(value, u64); + __uint(max_entries, XDP_UNKNOWN + 1); +} exception_cnt SEC(".maps"); /* Tracepoint format: /sys/kernel/debug/tracing/events/xdp/xdp_redirect/format * Code in: kernel/include/trace/events/xdp.h @@ -129,19 +129,19 @@ struct datarec { }; #define MAX_CPUS 64 -struct bpf_map_def SEC("maps") cpumap_enqueue_cnt = { - .type = BPF_MAP_TYPE_PERCPU_ARRAY, - .key_size = sizeof(u32), - .value_size = sizeof(struct datarec), - .max_entries = MAX_CPUS, -}; +struct { + __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); + __type(key, u32); + __type(value, struct datarec); + __uint(max_entries, MAX_CPUS); +} cpumap_enqueue_cnt SEC(".maps"); -struct bpf_map_def SEC("maps") cpumap_kthread_cnt = { - .type = BPF_MAP_TYPE_PERCPU_ARRAY, - .key_size = sizeof(u32), - .value_size = sizeof(struct datarec), - .max_entries = 1, -}; +struct { + __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); + __type(key, u32); + __type(value, struct datarec); + __uint(max_entries, 1); +} cpumap_kthread_cnt SEC(".maps"); /* Tracepoint: /sys/kernel/debug/tracing/events/xdp/xdp_cpumap_enqueue/format * Code in: kernel/include/trace/events/xdp.h @@ -210,12 +210,12 @@ int trace_xdp_cpumap_kthread(struct cpumap_kthread_ctx *ctx) return 0; } -struct bpf_map_def SEC("maps") devmap_xmit_cnt = { - .type = BPF_MAP_TYPE_PERCPU_ARRAY, - .key_size = sizeof(u32), - .value_size = sizeof(struct datarec), - .max_entries = 1, -}; +struct { + __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); + __type(key, u32); + __type(value, struct datarec); + __uint(max_entries, 1); +} devmap_xmit_cnt SEC(".maps"); /* Tracepoint: /sys/kernel/debug/tracing/events/xdp/xdp_devmap_xmit/format * Code in: kernel/include/trace/events/xdp.h diff --git a/samples/bpf/xdp_sample_pkts_kern.c b/samples/bpf/xdp_sample_pkts_kern.c index 33377289e2a8..2fc3ecc9d9aa 100644 --- a/samples/bpf/xdp_sample_pkts_kern.c +++ b/samples/bpf/xdp_sample_pkts_kern.c @@ -5,14 +5,12 @@ #include <bpf/bpf_helpers.h> #define SAMPLE_SIZE 64ul -#define MAX_CPUS 128 - -struct bpf_map_def SEC("maps") my_map = { - .type = BPF_MAP_TYPE_PERF_EVENT_ARRAY, - .key_size = sizeof(int), - .value_size = sizeof(u32), - .max_entries = MAX_CPUS, -}; + +struct { + __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); + __type(key, int); + __type(value, u32); +} my_map SEC(".maps"); SEC("xdp_sample") int xdp_sample_prog(struct xdp_md *ctx) diff --git a/samples/bpf/xdp_sample_pkts_user.c b/samples/bpf/xdp_sample_pkts_user.c index 991ef6f0880b..4b2a300c750c 100644 --- a/samples/bpf/xdp_sample_pkts_user.c +++ b/samples/bpf/xdp_sample_pkts_user.c @@ -18,7 +18,6 @@ #include "perf-sys.h" -#define MAX_CPUS 128 static int if_idx; static char *if_name; static __u32 xdp_flags = XDP_FLAGS_UPDATE_IF_NOEXIST;
Most of the samples were converted to use the new BTF-defined MAP as they moved to libbpf, but some of the samples were missing. Instead of using the previous BPF MAP definition, this commit refactors xdp_monitor and xdp_sample_pkts_kern MAP definition with the new BTF-defined MAP format. Also, this commit removes the max_entries attribute at PERF_EVENT_ARRAY map type. The libbpf's bpf_object__create_map() will automatically set max_entries to the maximum configured number of CPUs on the host. Signed-off-by: Daniel T. Lee <danieltimlee@gmail.com> --- samples/bpf/xdp_monitor_kern.c | 60 +++++++++++++++--------------- samples/bpf/xdp_sample_pkts_kern.c | 14 +++---- samples/bpf/xdp_sample_pkts_user.c | 1 - 3 files changed, 36 insertions(+), 39 deletions(-)