122 lines
3.4 KiB
Diff
122 lines
3.4 KiB
Diff
|
|
From 8d3d9c72513ac116996a05700f18c10b332e7699 Mon Sep 17 00:00:00 2001
|
||
|
|
From: Ciara Loftus <ciara.loftus@intel.com>
|
||
|
|
Date: Thu, 17 Feb 2022 14:45:24 +0000
|
||
|
|
Subject: [PATCH] net/af_xdp: make compatible with libbpf >= 0.7.0
|
||
|
|
|
||
|
|
[ upstream commit 8d3d9c72513ac116996a05700f18c10b332e7699 ]
|
||
|
|
|
||
|
|
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 <ciara.loftus@intel.com>
|
||
|
|
---
|
||
|
|
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 <bpf/xsk.h>
|
||
|
|
#endif
|
||
|
|
+#include <bpf/bpf.h>
|
||
|
|
#include <linux/version.h>
|
||
|
|
#include <poll.h>
|
||
|
|
|
||
|
|
@@ -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 <linux/ethtool.h>
|
||
|
|
#include <linux/sockios.h>
|
||
|
|
#include "af_xdp_deps.h"
|
||
|
|
-#include <bpf/bpf.h>
|
||
|
|
|
||
|
|
#include <rte_ethdev.h>
|
||
|
|
#include <ethdev_driver.h>
|
||
|
|
@@ -1176,13 +1175,13 @@ xsk_umem_info *xdp_umem_configure(struct pmd_internals *internals,
|
||
|
|
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.33.0
|
||
|
|
|