From 8d3d9c72513ac116996a05700f18c10b332e7699 Mon Sep 17 00:00:00 2001 From: Ciara Loftus Date: Thu, 17 Feb 2022 14:45:24 +0000 Subject: [PATCH] net/af_xdp: make compatible with libbpf >= 0.7.0 libbpf v0.7.0 deprecates the bpf_prog_load function. Use meson to detect if libbpf >= v0.7.0 is linked and if so, use the recommended replacement functions bpf_object__open_file and bpf_object__load. Signed-off-by: Ciara Loftus --- drivers/net/af_xdp/compat.h | 39 +++++++++++++++++++++++++++++ drivers/net/af_xdp/meson.build | 5 ++++ drivers/net/af_xdp/rte_eth_af_xdp.c | 9 +++---- 3 files changed, 48 insertions(+), 5 deletions(-) diff --git a/drivers/net/af_xdp/compat.h b/drivers/net/af_xdp/compat.h index bf40c6572e..28ea64aeaa 100644 --- a/drivers/net/af_xdp/compat.h +++ b/drivers/net/af_xdp/compat.h @@ -7,6 +7,7 @@ #else #include #endif +#include #include #include @@ -58,3 +59,41 @@ tx_syscall_needed(struct xsk_ring_prod *q __rte_unused) return 1; } #endif + +#ifdef RTE_NET_AF_XDP_LIBBPF_OBJ_OPEN +static int load_program(const char *prog_path, struct bpf_object **obj) +{ + struct bpf_program *prog; + int err; + + *obj = bpf_object__open_file(prog_path, NULL); + err = libbpf_get_error(*obj); + if (err) + return -1; + + err = bpf_object__load(*obj); + if (err) + goto out; + + prog = bpf_object__next_program(*obj, NULL); + if (!prog) + goto out; + + return bpf_program__fd(prog); + +out: + bpf_object__close(*obj); + return -1; +} +#else +static int load_program(const char *prog_path, struct bpf_object **obj) +{ + int ret, prog_fd; + + ret = bpf_prog_load(prog_path, BPF_PROG_TYPE_XDP, obj, &prog_fd); + if (ret) + return -1; + + return prog_fd; +} +#endif diff --git a/drivers/net/af_xdp/meson.build b/drivers/net/af_xdp/meson.build index 93e895eab9..1e0de23705 100644 --- a/drivers/net/af_xdp/meson.build +++ b/drivers/net/af_xdp/meson.build @@ -22,6 +22,11 @@ if cc.has_header('linux/if_xdp.h') cflags += ['-DRTE_NET_AF_XDP_SHARED_UMEM'] ext_deps += xdp_dep ext_deps += bpf_dep + bpf_ver_dep = dependency('libbpf', version : '>=0.7.0', + required: false, method: 'pkg-config') + if bpf_ver_dep.found() + cflags += ['-DRTE_NET_AF_XDP_LIBBPF_OBJ_OPEN'] + endif else build = false reason = 'missing dependency, libbpf' diff --git a/drivers/net/af_xdp/rte_eth_af_xdp.c b/drivers/net/af_xdp/rte_eth_af_xdp.c index 69dfa1b898..2477f31c7b 100644 --- a/drivers/net/af_xdp/rte_eth_af_xdp.c +++ b/drivers/net/af_xdp/rte_eth_af_xdp.c @@ -15,7 +15,6 @@ #include #include #include "af_xdp_deps.h" -#include #include #include @@ -1176,13 +1175,13 @@ err: static int load_custom_xdp_prog(const char *prog_path, int if_index, struct bpf_map **map) { - int ret, prog_fd = -1; + int ret, prog_fd; struct bpf_object *obj; - ret = bpf_prog_load(prog_path, BPF_PROG_TYPE_XDP, &obj, &prog_fd); - if (ret) { + prog_fd = load_program(prog_path, &obj); + if (prog_fd < 0) { AF_XDP_LOG(ERR, "Failed to load program %s\n", prog_path); - return ret; + return -1; } /* -- 2.39.5