net/af_xdp: use libxdp if available
Checks
Commit Message
AF_XDP support is deprecated in libbpf since v0.7.0 [1]. The
libxdp library now provides the functionality which once was in
libbpf and which the AF_XDP PMD relies on. This commit updates the
AF_XDP meson build to use the libxdp library if a version >= v1.3.0 is
available. If it is not available, only versions of libbpf prior to v0.7.0
are allowed, as they still contain the required AF_XDP functionality.
libbpf still remains a dependency even if libxdp is present, as we
use libbpf APIs for program loading.
The minimum required kernel version for libxdp for use with AF_XDP is v5.3.
For the library to be fully-featured, a kernel v5.10 or newer is
recommended. The full compatibility information can be found in the libxdp
README.
v1.3.0 of libxdp includes an important fix required for linking with
DPDK which is why this version or greater is required. Meson uses
pkg-config to verify the version of libxdp on the system, so it is
necessary that the library is discoverable using pkg-config in order for
the PMD to use it. To verify this, you can run:
pkg-config --modversion libxdp
[1] https://github.com/libbpf/libbpf/commit/277846bc6c15
Signed-off-by: Ciara Loftus <ciara.loftus@intel.com>
---
RFC -> v1:
* Set minimum libxdp version at v1.3.0
* Don't provide alternative to discovery via pkg-config
* Add missing newline to end of file
---
doc/guides/nics/af_xdp.rst | 6 ++--
doc/guides/rel_notes/release_22_03.rst | 4 +++
drivers/net/af_xdp/compat.h | 4 +++
drivers/net/af_xdp/meson.build | 39 +++++++++++++++++++++-----
drivers/net/af_xdp/rte_eth_af_xdp.c | 1 -
5 files changed, 42 insertions(+), 12 deletions(-)
@@ -43,9 +43,7 @@ Prerequisites
This is a Linux-specific PMD, thus the following prerequisites apply:
* A Linux Kernel (version > v4.18) with XDP sockets configuration enabled;
-* libbpf (within kernel version > v5.1-rc4) with latest af_xdp support installed,
- User can install libbpf via `make install_lib` && `make install_headers` in
- <kernel src tree>/tools/lib/bpf;
+* Both libxdp >=v1.3.0 and libbpf libraries installed, or, libbpf <=v0.6.0
* A Kernel bound interface to attach to;
* For need_wakeup feature, it requires kernel version later than v5.3-rc1;
* For PMD zero copy, it requires kernel version later than v5.4-rc1;
@@ -143,4 +141,4 @@ Limitations
NAPI context from a watchdog timer instead of from softirqs. More information
on this feature can be found at [1].
- [1] https://lwn.net/Articles/837010/
\ No newline at end of file
+ [1] https://lwn.net/Articles/837010/
@@ -55,6 +55,10 @@ New Features
Also, make sure to start the actual text at the margin.
=======================================================
+* **Update AF_XDP PMD**
+
+ * Added support for libxdp >=v1.3.0.
+
Removed Items
-------------
@@ -2,7 +2,11 @@
* Copyright(c) 2020 Intel Corporation.
*/
+#ifdef RTE_LIBRTE_AF_XDP_PMD_LIBXDP
+#include <xdp/xsk.h>
+#else
#include <bpf/xsk.h>
+#endif
#include <linux/version.h>
#include <poll.h>
@@ -9,19 +9,44 @@ endif
sources = files('rte_eth_af_xdp.c')
+xdp_dep = dependency('libxdp', version : '>=1.3.0', required: false, method: 'pkg-config')
bpf_dep = dependency('libbpf', required: false, method: 'pkg-config')
if not bpf_dep.found()
bpf_dep = cc.find_library('bpf', required: false)
endif
-if bpf_dep.found() and cc.has_header('bpf/xsk.h') and cc.has_header('linux/if_xdp.h')
- ext_deps += bpf_dep
- bpf_ver_dep = dependency('libbpf', version : '>=0.2.0',
- required: false, method: 'pkg-config')
- if bpf_ver_dep.found()
- dpdk_conf.set('RTE_LIBRTE_AF_XDP_PMD_SHARED_UMEM', 1)
+if cc.has_header('linux/if_xdp.h')
+ if xdp_dep.found() and cc.has_header('xdp/xsk.h')
+ if bpf_dep.found() and cc.has_header('bpf/bpf.h')
+ dpdk_conf.set('RTE_LIBRTE_AF_XDP_PMD_LIBXDP', 1)
+ dpdk_conf.set('RTE_LIBRTE_AF_XDP_PMD_SHARED_UMEM', 1)
+ ext_deps += xdp_dep
+ ext_deps += bpf_dep
+ else
+ build = false
+ reason = 'missing dependency, libbpf'
+ endif
+ elif bpf_dep.found() and cc.has_header('bpf/xsk.h') and cc.has_header('bpf/bpf.h')
+ # libxdp not found. Rely solely on libbpf for xsk functionality
+ # which is only available in versions <= v0.6.0.
+ bpf_ver_dep = dependency('libbpf', version : '<=0.6.0',
+ required: false, method: 'pkg-config')
+ if bpf_ver_dep.found()
+ ext_deps += bpf_dep
+ bpf_shumem_ver_dep = dependency('libbpf', version : '>=0.2.0',
+ required: false, method: 'pkg-config')
+ if bpf_shumem_ver_dep.found()
+ dpdk_conf.set('RTE_LIBRTE_AF_XDP_PMD_SHARED_UMEM', 1)
+ endif
+ else
+ build = false
+ reason = 'missing dependency, "libxdp" or "libbpf <= v0.6.0"'
+ endif
+ else
+ build = false
+ reason = 'missing dependency, "libxdp" and "libbpf"'
endif
else
build = false
- reason = 'missing dependency, "libbpf"'
+ reason = 'missing header, "linux/if_xdp.h"'
endif
@@ -16,7 +16,6 @@
#include <linux/sockios.h>
#include "af_xdp_deps.h"
#include <bpf/bpf.h>
-#include <bpf/xsk.h>
#include <rte_ethdev.h>
#include <ethdev_driver.h>