Netdev List
 help / color / mirror / Atom feed
* [PATCH net-next 0/4] selftests: move the AF_XDP test suite from bpf to net
@ 2026-11-05 13:41 Maciej Fijalkowski
  2026-11-05 13:41 ` [PATCH net-next 1/4] selftests/bpf: drop the test_progs AF_XDP wrapper Maciej Fijalkowski
                   ` (4 more replies)
  0 siblings, 5 replies; 9+ messages in thread
From: Maciej Fijalkowski @ 2026-11-05 13:41 UTC (permalink / raw)
  To: netdev
  Cc: magnus.karlsson, stfomichev, kuba, pabeni, tushar.vyavahare,
	kerneljasonxing, bjorn, Maciej Fijalkowski

Hi,

As the maintainers asked, this series is the first step of moving the
AF_XDP selftests from selftests/bpf to selftests/net: the code moves and
builds from its new location, without changing what the tests do. The
rework [0] posted as "selftests: net: migrate AF_XDP test suite over to
net" (v4) will follow on top of this move.

Patch 1 drops the test_progs wrapper of the AF_XDP tests, patch 2 adds a
generic BPF skeleton rule to net/bpf.mk, patch 3 moves xskxceiver, its
library and test_xsk.sh to selftests/net, and patch 4 (new, not covered
at [0]) moves xdp_hw_metadata, which is built from the same library.

The xdp_metadata test stays in test_progs: it covers BPF core
behaviour, and moving it would mean rewriting it for the kselftest
harness. It keeps using xsk.c from net/lib/xsk.

xskxceiver and xdp_hw_metadata are the first users of bpftool at build
time in selftests/net. NIPA has bpftool, but 0-day and KernelCI build
net without it, so both tools are skipped with a warning when bpftool
is missing or does not run.

test_xsk.sh is installed but not run by run_tests, so NIPA does not pick
it up: it runs every case, including flaky ones, and some cases leak
page_pool pages after skb_pp_cow_data() in generic XDP mode on
veth-based runs. Until a later step makes the suite fit for NIPA, no CI
runs the AF_XDP tests. test_xsk.sh is being removed by [0] but it is
kept here as there is no other feasible way to run the test suite (if
needed) until we come up with an upstreamable Python runner.

Thanks,
Maciej

[0]: https://lore.kernel.org/bpf/20261016174338.787135-1-maciej.fijalkowski@intel.com/

Maciej Fijalkowski (4):
  selftests/bpf: drop the test_progs AF_XDP wrapper
  selftests: net: add a generic rule for BPF skeletons
  selftests: xsk: move the AF_XDP test suite to selftests/net
  selftests: net: move xdp_hw_metadata from selftests/bpf

 Documentation/networking/af_xdp.rst           |   6 +-
 Documentation/networking/xsk-tx-metadata.rst  |   2 +-
 MAINTAINERS                                   |   4 +-
 tools/testing/selftests/bpf/.gitignore        |   2 -
 tools/testing/selftests/bpf/Makefile          |  29 +--
 .../testing/selftests/bpf/Makefile.buildvars  |   6 +-
 tools/testing/selftests/bpf/network_helpers.c |  48 -----
 tools/testing/selftests/bpf/network_helpers.h |   2 -
 tools/testing/selftests/bpf/prog_tests/xsk.c  | 170 ------------------
 tools/testing/selftests/net/.gitignore        |   2 +
 tools/testing/selftests/net/Makefile          |  20 +++
 tools/testing/selftests/net/bpf.mk            |  13 +-
 tools/testing/selftests/net/config            |   1 +
 tools/testing/selftests/net/lib/.gitignore    |   2 +
 tools/testing/selftests/net/lib/Makefile      |  25 +++
 .../prog_tests => net/lib/xsk}/test_xsk.c     |   2 +-
 .../prog_tests => net/lib/xsk}/test_xsk.h     |   5 +-
 .../selftests/{bpf => net/lib/xsk}/xsk.c      |  49 ++++-
 .../selftests/{bpf => net/lib/xsk}/xsk.h      |   4 +
 .../{bpf => net/lib/xsk}/xsk_xdp_common.h     |   0
 .../lib/xsk/xsk_xdp_progs.bpf.c}              |   2 +-
 .../{bpf => net/lib/xsk}/xskxceiver.c         |  17 +-
 .../{bpf => net/lib/xsk}/xskxceiver.h         |   0
 .../selftests/{bpf => net}/test_xsk.sh        |   5 +
 .../xdp_hw_metadata.bpf.c}                    |  35 +++-
 .../selftests/{bpf => net}/xdp_hw_metadata.c  |  81 ++++++++-
 tools/testing/selftests/net/xdp_metadata.h    |  67 +++++++
 .../selftests/{bpf => net}/xsk_prereqs.sh     |   2 +-
 28 files changed, 307 insertions(+), 294 deletions(-)
 delete mode 100644 tools/testing/selftests/bpf/prog_tests/xsk.c
 rename tools/testing/selftests/{bpf/prog_tests => net/lib/xsk}/test_xsk.c (99%)
 rename tools/testing/selftests/{bpf/prog_tests => net/lib/xsk}/test_xsk.h (99%)
 rename tools/testing/selftests/{bpf => net/lib/xsk}/xsk.c (95%)
 rename tools/testing/selftests/{bpf => net/lib/xsk}/xsk.h (97%)
 rename tools/testing/selftests/{bpf => net/lib/xsk}/xsk_xdp_common.h (100%)
 rename tools/testing/selftests/{bpf/progs/xsk_xdp_progs.c => net/lib/xsk/xsk_xdp_progs.bpf.c} (98%)
 rename tools/testing/selftests/{bpf => net/lib/xsk}/xskxceiver.c (96%)
 rename tools/testing/selftests/{bpf => net/lib/xsk}/xskxceiver.h (100%)
 rename tools/testing/selftests/{bpf => net}/test_xsk.sh (98%)
 rename tools/testing/selftests/{bpf/progs/xdp_hw_metadata.c => net/xdp_hw_metadata.bpf.c} (75%)
 rename tools/testing/selftests/{bpf => net}/xdp_hw_metadata.c (92%)
 create mode 100644 tools/testing/selftests/net/xdp_metadata.h
 rename tools/testing/selftests/{bpf => net}/xsk_prereqs.sh (98%)


base-commit: 7b6ab4dbc156e2f96419715130b3d5738a306c93
-- 
2.43.0


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH net-next 1/4] selftests/bpf: drop the test_progs AF_XDP wrapper
  2026-11-05 13:41 [PATCH net-next 0/4] selftests: move the AF_XDP test suite from bpf to net Maciej Fijalkowski
@ 2026-11-05 13:41 ` Maciej Fijalkowski
  2026-11-05 13:41 ` [PATCH net-next 2/4] selftests: net: add a generic rule for BPF skeletons Maciej Fijalkowski
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 9+ messages in thread
From: Maciej Fijalkowski @ 2026-11-05 13:41 UTC (permalink / raw)
  To: netdev
  Cc: magnus.karlsson, stfomichev, kuba, pabeni, tushar.vyavahare,
	kerneljasonxing, bjorn, Maciej Fijalkowski

prog_tests/xsk.c runs the xskxceiver cases inside test_progs. With the
AF_XDP test suite moving to selftests/net in a following patch, the
wrapper would make test_progs build the engine and its XDP program
from there, so drop it.

BPF CI loses ns_xsk_skb and ns_xsk_drv. test_xsk.sh still covers the
same cases over veth, but no CI runs it until the suite is ready for
NIPA.

ci_skip_tests[] only held the cases that the wrapper left out, so fold
it into tests[]. The test IDs do not change.

Reviewed-by: Björn Töpel <bjorn@kernel.org>
Signed-off-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
---
 .../selftests/bpf/prog_tests/test_xsk.h       |   3 -
 tools/testing/selftests/bpf/prog_tests/xsk.c  | 170 ------------------
 tools/testing/selftests/bpf/xskxceiver.c      |  10 +-
 3 files changed, 2 insertions(+), 181 deletions(-)
 delete mode 100644 tools/testing/selftests/bpf/prog_tests/xsk.c

diff --git a/tools/testing/selftests/bpf/prog_tests/test_xsk.h b/tools/testing/selftests/bpf/prog_tests/test_xsk.h
index 03753ddc5dcd..69158b67466c 100644
--- a/tools/testing/selftests/bpf/prog_tests/test_xsk.h
+++ b/tools/testing/selftests/bpf/prog_tests/test_xsk.h
@@ -297,9 +297,6 @@ static const struct test_spec tests[] = {
 	{.name = "TOO_MANY_FRAGS", .test_func = testapp_too_many_frags},
 	{.name = "XDP_ADJUST_TAIL_SHRINK", .test_func = testapp_adjust_tail_shrink},
 	{.name = "TX_QUEUE_CONSUMER", .test_func = testapp_tx_queue_consumer},
-	};
-
-static const struct test_spec ci_skip_tests[] = {
 	/* Flaky tests */
 	{.name = "XDP_ADJUST_TAIL_SHRINK_MULTI_BUFF", .test_func = testapp_adjust_tail_shrink_mb},
 	{.name = "XDP_ADJUST_TAIL_GROW", .test_func = testapp_adjust_tail_grow},
diff --git a/tools/testing/selftests/bpf/prog_tests/xsk.c b/tools/testing/selftests/bpf/prog_tests/xsk.c
deleted file mode 100644
index 772f3dd7ce64..000000000000
--- a/tools/testing/selftests/bpf/prog_tests/xsk.c
+++ /dev/null
@@ -1,170 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-#include <net/if.h>
-#include <stdarg.h>
-
-#include "network_helpers.h"
-#include "test_progs.h"
-#include "test_xsk.h"
-#include "xsk_xdp_progs.skel.h"
-
-#define VETH_RX "veth0"
-#define VETH_TX "veth1"
-#define MTU	1500
-
-int setup_veth(bool busy_poll)
-{
-	SYS(fail,
-	"ip link add %s numtxqueues 4 numrxqueues 4 type veth peer name %s numtxqueues 4 numrxqueues 4",
-	VETH_RX, VETH_TX);
-	SYS(fail, "sysctl -wq net.ipv6.conf.%s.disable_ipv6=1", VETH_RX);
-	SYS(fail, "sysctl -wq net.ipv6.conf.%s.disable_ipv6=1", VETH_TX);
-
-	if (busy_poll) {
-		SYS(fail, "echo 2 > /sys/class/net/%s/napi_defer_hard_irqs", VETH_RX);
-		SYS(fail, "echo 200000 > /sys/class/net/%s/gro_flush_timeout", VETH_RX);
-		SYS(fail, "echo 2 > /sys/class/net/%s/napi_defer_hard_irqs", VETH_TX);
-		SYS(fail, "echo 200000 > /sys/class/net/%s/gro_flush_timeout", VETH_TX);
-	}
-
-	SYS(fail, "ip link set %s mtu %d", VETH_RX, MTU);
-	SYS(fail, "ip link set %s mtu %d", VETH_TX, MTU);
-	SYS(fail, "ip link set %s up", VETH_RX);
-	SYS(fail, "ip link set %s up", VETH_TX);
-
-	return 0;
-
-fail:
-	return -1;
-}
-
-void delete_veth(void)
-{
-	SYS_NOFAIL("ip link del %s", VETH_RX);
-	SYS_NOFAIL("ip link del %s", VETH_TX);
-}
-
-int configure_ifobj(struct ifobject *tx, struct ifobject *rx)
-{
-	rx->ifindex = if_nametoindex(VETH_RX);
-	if (!ASSERT_OK_FD(rx->ifindex, "get RX ifindex"))
-		return -1;
-
-	tx->ifindex = if_nametoindex(VETH_TX);
-	if (!ASSERT_OK_FD(tx->ifindex, "get TX ifindex"))
-		return -1;
-
-	tx->shared_umem = false;
-	rx->shared_umem = false;
-
-
-	return 0;
-}
-
-static void test_xsk(const struct test_spec *test_to_run, enum test_mode mode)
-{
-	u32 max_frags, umem_tailroom, cache_line_size;
-	struct ifobject *ifobj_tx, *ifobj_rx;
-	struct test_spec test;
-	int ret;
-
-	ifobj_tx = ifobject_create();
-	if (!ASSERT_OK_PTR(ifobj_tx, "create ifobj_tx"))
-		return;
-
-	ifobj_rx = ifobject_create();
-	if (!ASSERT_OK_PTR(ifobj_rx, "create ifobj_rx"))
-		goto delete_tx;
-
-	if (!ASSERT_OK(configure_ifobj(ifobj_tx, ifobj_rx), "configure ifobj"))
-		goto delete_rx;
-
-	ret = get_hw_ring_size(ifobj_tx->ifname, &ifobj_tx->ring);
-	if (!ret) {
-		ifobj_tx->hw_ring_size_supp = true;
-		ifobj_tx->set_ring.default_tx = ifobj_tx->ring.tx_pending;
-		ifobj_tx->set_ring.default_rx = ifobj_tx->ring.rx_pending;
-	}
-
-	cache_line_size = read_procfs_val(SMP_CACHE_BYTES_PATH);
-	if (!cache_line_size)
-		cache_line_size = 64;
-
-	max_frags = read_procfs_val(MAX_SKB_FRAGS_PATH);
-	if (!max_frags)
-		max_frags = 17;
-
-	ifobj_tx->max_skb_frags = max_frags;
-	ifobj_rx->max_skb_frags = max_frags;
-
-	/* 48 bytes is a part of skb_shared_info w/o frags array;
-	 * 16 bytes is sizeof(skb_frag_t)
-	 */
-	umem_tailroom = ALIGN(48 + (max_frags * 16), cache_line_size);
-	ifobj_tx->umem_tailroom = umem_tailroom;
-	ifobj_rx->umem_tailroom = umem_tailroom;
-
-	if (!ASSERT_OK(init_iface(ifobj_rx, worker_testapp_validate_rx), "init RX"))
-		goto delete_rx;
-	if (!ASSERT_OK(init_iface(ifobj_tx, worker_testapp_validate_tx), "init TX"))
-		goto delete_rx;
-
-	test_init(&test, ifobj_tx, ifobj_rx, 0, &tests[0]);
-
-	test.tx_pkt_stream_default = pkt_stream_generate(DEFAULT_PKT_CNT, MIN_PKT_SIZE);
-	if (!ASSERT_OK_PTR(test.tx_pkt_stream_default, "TX pkt generation"))
-		goto delete_rx;
-	test.rx_pkt_stream_default = pkt_stream_generate(DEFAULT_PKT_CNT, MIN_PKT_SIZE);
-	if (!ASSERT_OK_PTR(test.rx_pkt_stream_default, "RX pkt generation"))
-		goto delete_rx;
-
-
-	test_init(&test, ifobj_tx, ifobj_rx, mode, test_to_run);
-	ret = test.test_func(&test);
-	if (ret != TEST_SKIP)
-		ASSERT_OK(ret, "Run test");
-	pkt_stream_restore_default(&test);
-
-	if (ifobj_tx->hw_ring_size_supp)
-		hw_ring_size_reset(ifobj_tx);
-
-	pkt_stream_delete(test.tx_pkt_stream_default);
-	pkt_stream_delete(test.rx_pkt_stream_default);
-	xsk_xdp_progs__destroy(ifobj_tx->xdp_progs);
-	xsk_xdp_progs__destroy(ifobj_rx->xdp_progs);
-
-delete_rx:
-	ifobject_delete(ifobj_rx);
-delete_tx:
-	ifobject_delete(ifobj_tx);
-}
-
-void test_ns_xsk_skb(void)
-{
-	int i;
-
-	if (!ASSERT_OK(setup_veth(false), "setup veth"))
-		return;
-
-	for (i = 0; i < ARRAY_SIZE(tests); i++) {
-		if (test__start_subtest(tests[i].name))
-			test_xsk(&tests[i], TEST_MODE_SKB);
-	}
-
-	delete_veth();
-}
-
-void test_ns_xsk_drv(void)
-{
-	int i;
-
-	if (!ASSERT_OK(setup_veth(false), "setup veth"))
-		return;
-
-	for (i = 0; i < ARRAY_SIZE(tests); i++) {
-		if (test__start_subtest(tests[i].name))
-			test_xsk(&tests[i], TEST_MODE_DRV);
-	}
-
-	delete_veth();
-}
-
diff --git a/tools/testing/selftests/bpf/xskxceiver.c b/tools/testing/selftests/bpf/xskxceiver.c
index 7dad8556a722..6cf95a44c8c0 100644
--- a/tools/testing/selftests/bpf/xskxceiver.c
+++ b/tools/testing/selftests/bpf/xskxceiver.c
@@ -327,14 +327,12 @@ static void print_tests(void)
 	printf("Tests:\n");
 	for (i = 0; i < ARRAY_SIZE(tests); i++)
 		printf("%u: %s\n", i, tests[i].name);
-	for (i = ARRAY_SIZE(tests); i < ARRAY_SIZE(tests) + ARRAY_SIZE(ci_skip_tests); i++)
-		printf("%u: %s\n", i, ci_skip_tests[i - ARRAY_SIZE(tests)].name);
 }
 
 int main(int argc, char **argv)
 {
-	const size_t total_tests = ARRAY_SIZE(tests) + ARRAY_SIZE(ci_skip_tests);
 	u32 cache_line_size, max_frags, umem_tailroom;
+	const size_t total_tests = ARRAY_SIZE(tests);
 	struct pkt_stream *rx_pkt_stream_default;
 	struct pkt_stream *tx_pkt_stream_default;
 	struct ifobject *ifobj_tx, *ifobj_rx;
@@ -449,11 +447,7 @@ int main(int argc, char **argv)
 			if (opt_run_test != RUN_ALL_TESTS && j != opt_run_test)
 				continue;
 
-			if (j < ARRAY_SIZE(tests))
-				test_init(&test, ifobj_tx, ifobj_rx, i, &tests[j]);
-			else
-				test_init(&test, ifobj_tx, ifobj_rx, i,
-					  &ci_skip_tests[j - ARRAY_SIZE(tests)]);
+			test_init(&test, ifobj_tx, ifobj_rx, i, &tests[j]);
 			run_pkt_test(&test);
 			usleep(USLEEP_MAX);
 
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH net-next 2/4] selftests: net: add a generic rule for BPF skeletons
  2026-11-05 13:41 [PATCH net-next 0/4] selftests: move the AF_XDP test suite from bpf to net Maciej Fijalkowski
  2026-11-05 13:41 ` [PATCH net-next 1/4] selftests/bpf: drop the test_progs AF_XDP wrapper Maciej Fijalkowski
@ 2026-11-05 13:41 ` Maciej Fijalkowski
  2026-11-05 13:41 ` [PATCH net-next 3/4] selftests: xsk: move the AF_XDP test suite to selftests/net Maciej Fijalkowski
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 9+ messages in thread
From: Maciej Fijalkowski @ 2026-11-05 13:41 UTC (permalink / raw)
  To: netdev
  Cc: magnus.karlsson, stfomichev, kuba, pabeni, tushar.vyavahare,
	kerneljasonxing, bjorn, Maciej Fijalkowski

Tests that load their BPF program through a bpftool skeleton have to
bring their own rule for the header. Add a pattern rule to bpf.mk that
generates $(OUTPUT)/<name>.skel.h from $(OUTPUT)/<name>.bpf.o with
$(BPFTOOL), the bpftool in PATH by default, and removes the partial
header if bpftool fails.

Also build the programs in the subdirectories listed in BPF_PROG_DIRS,
and have make clean remove all program objects and their skeletons.

xskxceiver, which moves to net/lib/xsk in the next patch, is the first
user of both.

Signed-off-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
---
 tools/testing/selftests/net/bpf.mk | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/tools/testing/selftests/net/bpf.mk b/tools/testing/selftests/net/bpf.mk
index a4f6755dd894..e0e10cf44af3 100644
--- a/tools/testing/selftests/net/bpf.mk
+++ b/tools/testing/selftests/net/bpf.mk
@@ -1,6 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 # Rules to generate bpf objs
 CLANG ?= clang
+BPFTOOL ?= bpftool
 SCRATCH_DIR := $(OUTPUT)/tools
 BUILD_DIR := $(SCRATCH_DIR)/build
 BPFDIR := $(top_srcdir)/tools/lib/bpf
@@ -35,13 +36,21 @@ endif
 
 CLANG_SYS_INCLUDES = $(call get_sys_includes,$(CLANG),$(CLANG_TARGET_ARCH))
 
-BPF_PROG_OBJS := $(patsubst %.c,$(OUTPUT)/%.o,$(wildcard *.bpf.c))
+# Programs come from *.bpf.c here and in the subdirectories in BPF_PROG_DIRS.
+BPF_PROG_SRCS := $(wildcard *.bpf.c $(addsuffix /*.bpf.c,$(BPF_PROG_DIRS)))
+BPF_PROG_OBJS := $(patsubst %.c,$(OUTPUT)/%.o,$(notdir $(BPF_PROG_SRCS)))
+vpath %.bpf.c $(BPF_PROG_DIRS)
 
 $(BPF_PROG_OBJS): $(OUTPUT)/%.o : %.c $(BPFOBJ) | $(MAKE_DIRS)
 	$(call msg,BPF_PROG,,$@)
 	$(Q)$(CLANG) -O2 -g --target=bpf $(CCINCLUDE) $(CLANG_SYS_INCLUDES) \
 	-c $< -o $@
 
+$(OUTPUT)/%.skel.h: $(OUTPUT)/%.bpf.o
+	$(call msg,GEN-SKEL,,$@)
+	$(Q)$(BPFTOOL) gen skeleton $< name $(notdir $*) > $@ || \
+		{ rm -f $@; exit 1; }
+
 $(BPFOBJ): $(wildcard $(BPFDIR)/*.[ch] $(BPFDIR)/Makefile)		       \
 	   $(APIDIR)/linux/bpf.h					       \
 	   | $(BUILD_DIR)/libbpf
@@ -50,4 +59,4 @@ $(BPFOBJ): $(wildcard $(BPFDIR)/*.[ch] $(BPFDIR)/Makefile)		       \
 		    EXTRA_CFLAGS='-g -O0'				       \
 		    DESTDIR=$(SCRATCH_DIR) prefix= all install_headers
 
-EXTRA_CLEAN += $(SCRATCH_DIR)
+EXTRA_CLEAN += $(SCRATCH_DIR) $(BPF_PROG_OBJS) $(BPF_PROG_OBJS:.bpf.o=.skel.h)
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH net-next 3/4] selftests: xsk: move the AF_XDP test suite to selftests/net
  2026-11-05 13:41 [PATCH net-next 0/4] selftests: move the AF_XDP test suite from bpf to net Maciej Fijalkowski
  2026-11-05 13:41 ` [PATCH net-next 1/4] selftests/bpf: drop the test_progs AF_XDP wrapper Maciej Fijalkowski
  2026-11-05 13:41 ` [PATCH net-next 2/4] selftests: net: add a generic rule for BPF skeletons Maciej Fijalkowski
@ 2026-11-05 13:41 ` Maciej Fijalkowski
  2026-11-05 13:41 ` [PATCH net-next 4/4] selftests: net: move xdp_hw_metadata from selftests/bpf Maciej Fijalkowski
  2026-11-05 20:43 ` [PATCH net-next 0/4] selftests: move the AF_XDP test suite from bpf to net Stanislav Fomichev
  4 siblings, 0 replies; 9+ messages in thread
From: Maciej Fijalkowski @ 2026-11-05 13:41 UTC (permalink / raw)
  To: netdev
  Cc: magnus.karlsson, stfomichev, kuba, pabeni, tushar.vyavahare,
	kerneljasonxing, bjorn, Maciej Fijalkowski

Move the xskxceiver engine, the AF_XDP userspace library, the test
definitions and the XDP program to net/lib/xsk, and test_xsk.sh with
xsk_prereqs.sh to selftests/net.

net/lib builds the XDP program and its skeleton with the bpf.mk rules,
and skips xskxceiver with a warning when bpftool does not work, in
which case test_xsk.sh skips too. List test_xsk.sh in
TEST_PROGS_EXTENDED, so that it is installed but NIPA does not run it
yet: it runs every case, flaky ones included.

xskxceiver builds against the uapi headers from make headers, whose
linux/netlink.h does not pull in linux/kernel.h, so include it for
min_t() directly. Put tools/include ahead of CFLAGS, so that in O=
builds a stale usr/include in the source tree does not shadow its
linux/kernel.h and linux/types.h. Move the ethtool ring helpers from
network_helpers into xsk.c, and cast to void * in the bound check of
the XDP program, as bpf.mk does not build with
-Wno-compare-distinct-pointer-types.

xdp_hw_metadata and the xdp_metadata test keep using xsk.c from
net/lib/xsk: selftests/bpf builds xsk.o from there in place of the
find_bit.o rule, which only test_xsk.c needed. Update MAINTAINERS.

Reviewed-by: Björn Töpel <bjorn@kernel.org>
Signed-off-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
---
 Documentation/networking/af_xdp.rst           |  6 +--
 MAINTAINERS                                   |  3 +-
 tools/testing/selftests/bpf/.gitignore        |  1 -
 tools/testing/selftests/bpf/Makefile          | 25 +++-------
 .../testing/selftests/bpf/Makefile.buildvars  |  6 +--
 tools/testing/selftests/bpf/network_helpers.c | 48 ------------------
 tools/testing/selftests/bpf/network_helpers.h |  2 -
 tools/testing/selftests/net/Makefile          |  2 +
 tools/testing/selftests/net/config            |  1 +
 tools/testing/selftests/net/lib/.gitignore    |  2 +
 tools/testing/selftests/net/lib/Makefile      | 25 ++++++++++
 .../prog_tests => net/lib/xsk}/test_xsk.c     |  2 +-
 .../prog_tests => net/lib/xsk}/test_xsk.h     |  2 +-
 .../selftests/{bpf => net/lib/xsk}/xsk.c      | 49 ++++++++++++++++++-
 .../selftests/{bpf => net/lib/xsk}/xsk.h      |  4 ++
 .../{bpf => net/lib/xsk}/xsk_xdp_common.h     |  0
 .../lib/xsk/xsk_xdp_progs.bpf.c}              |  2 +-
 .../{bpf => net/lib/xsk}/xskxceiver.c         |  7 +--
 .../{bpf => net/lib/xsk}/xskxceiver.h         |  0
 .../selftests/{bpf => net}/test_xsk.sh        |  5 ++
 .../selftests/{bpf => net}/xsk_prereqs.sh     |  2 +-
 21 files changed, 108 insertions(+), 86 deletions(-)
 rename tools/testing/selftests/{bpf/prog_tests => net/lib/xsk}/test_xsk.c (99%)
 rename tools/testing/selftests/{bpf/prog_tests => net/lib/xsk}/test_xsk.h (99%)
 rename tools/testing/selftests/{bpf => net/lib/xsk}/xsk.c (95%)
 rename tools/testing/selftests/{bpf => net/lib/xsk}/xsk.h (97%)
 rename tools/testing/selftests/{bpf => net/lib/xsk}/xsk_xdp_common.h (100%)
 rename tools/testing/selftests/{bpf/progs/xsk_xdp_progs.c => net/lib/xsk/xsk_xdp_progs.bpf.c} (98%)
 rename tools/testing/selftests/{bpf => net/lib/xsk}/xskxceiver.c (99%)
 rename tools/testing/selftests/{bpf => net/lib/xsk}/xskxceiver.h (100%)
 rename tools/testing/selftests/{bpf => net}/test_xsk.sh (98%)
 rename tools/testing/selftests/{bpf => net}/xsk_prereqs.sh (98%)

diff --git a/Documentation/networking/af_xdp.rst b/Documentation/networking/af_xdp.rst
index cc3f0d16b28f..538e71adb759 100644
--- a/Documentation/networking/af_xdp.rst
+++ b/Documentation/networking/af_xdp.rst
@@ -211,7 +211,7 @@ Libbpf
 
 Libbpf is a helper library for eBPF and XDP that makes using these
 technologies a lot simpler. It also contains specific helper functions
-in tools/testing/selftests/bpf/xsk.h for facilitating the use of
+in tools/testing/selftests/net/lib/xsk/xsk.h for facilitating the use of
 AF_XDP. It contains two types of functions: those that can be used to
 make the setup of AF_XDP socket easier and ones that can be used in the
 data plane to access the rings safely and quickly.
@@ -751,7 +751,7 @@ return values:
      returned number signifies the max number of frags supported.
 
 For an example on how these are used through libbpf, please take a
-look at tools/testing/selftests/bpf/xskxceiver.c.
+look at tools/testing/selftests/net/lib/xsk/xskxceiver.c.
 
 Multi-Buffer Support for Zero-Copy Drivers
 ------------------------------------------
@@ -785,7 +785,7 @@ can be displayed with "-h", as usual.
 This sample application uses libbpf to make the setup and usage of
 AF_XDP simpler. If you want to know how the raw uapi of AF_XDP is
 really used to make something more advanced, take a look at the libbpf
-code in tools/testing/selftests/bpf/xsk.[ch].
+code in tools/testing/selftests/net/lib/xsk/xsk.[ch].
 
 FAQ
 =======
diff --git a/MAINTAINERS b/MAINTAINERS
index 09713dc4c6a7..12e444f1f7a6 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -30434,7 +30434,8 @@ F:	include/net/xsk_buff_pool.h
 F:	include/uapi/linux/if_xdp.h
 F:	include/uapi/linux/xdp_diag.h
 F:	net/xdp/
-F:	tools/testing/selftests/bpf/*xsk*
+F:	tools/testing/selftests/net/*xsk*
+F:	tools/testing/selftests/net/lib/xsk/
 
 XEN BLOCK SUBSYSTEM
 M:	Roger Pau Monné <roger@xenproject.org>
diff --git a/tools/testing/selftests/bpf/.gitignore b/tools/testing/selftests/bpf/.gitignore
index b815bf0d8877..cd098c0271ef 100644
--- a/tools/testing/selftests/bpf/.gitignore
+++ b/tools/testing/selftests/bpf/.gitignore
@@ -36,7 +36,6 @@ test_cpp
 /uprobe_multi
 *.ko
 *.tmp
-xskxceiver
 xdp_redirect_multi
 xdp_synproxy
 xdp_hw_metadata
diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile
index c99e0f623e10..203f2cedaf77 100644
--- a/tools/testing/selftests/bpf/Makefile
+++ b/tools/testing/selftests/bpf/Makefile
@@ -33,14 +33,13 @@ TEST_GEN_PROGS += test_progs-cpuv4
 TEST_INST_SUBDIRS += cpuv4
 endif
 
-TEST_FILES = xsk_prereqs.sh $(wildcard progs/btf_dump_test_case_*.c)	\
+TEST_FILES = $(wildcard progs/btf_dump_test_case_*.c)	\
 	     bpftool_btf_dump_sorted.expected					\
 	     bpftool_btf_dump_unsorted.expected
 
 # Order correspond to 'make run_tests' order
 TEST_PROGS := test_bpftool_build.sh \
 	test_doc_build.sh \
-	test_xsk.sh \
 	test_xdp_features.sh
 
 TEST_PROGS_EXTENDED := \
@@ -58,8 +57,7 @@ TEST_GEN_PROGS_EXTENDED = \
 	veristat \
 	xdp_features \
 	xdp_hw_metadata \
-	xdp_synproxy \
-	xskxceiver
+	xdp_synproxy
 
 TEST_GEN_FILES += $(TEST_KMODS) liburandom_read.so urandom_read sign-file uprobe_multi
 
@@ -257,9 +255,9 @@ $(RUNNER_OBJS): $(VERIFY_SIG_HDR) $(BPFOBJ) $(TRUNNER_BPFTOOL)
 $(OUTPUT)/test_progs.o: prog_tests/tests.h
 $(OUTPUT)/test_maps.o: map_tests/tests.h
 
-# find_bit.c is the only runner source outside this directory, so it
-# needs a rule of its own.
-$(OUTPUT)/find_bit.o: $(TOOLSDIR)/lib/find_bit.c
+# xsk.c is the only runner source outside this directory, so it needs a
+# rule of its own.
+$(OUTPUT)/xsk.o: ../net/lib/xsk/xsk.c
 	$(call msg,CC,,$@)
 	$(Q)$(CC) $(CFLAGS) -c $< $(LDLIBS) -o $@
 
@@ -570,18 +568,9 @@ $(OUTPUT)/test_verifier: test_verifier.c verifier/tests.h $(BPFOBJ) | $(OUTPUT)
 	$(call msg,BINARY,,$@)
 	$(Q)$(CC) $(CFLAGS) $(filter %.a %.o %.c,$^) $(LDLIBS) -o $@
 
-# Keep xskxceiver independent from test_progs object dependencies.
-$(OUTPUT)/xskxceiver: xskxceiver.c xsk.c network_helpers.c \
-			   $(TOOLSDIR)/lib/find_bit.c prog_tests/test_xsk.c \
-			   xskxceiver.h xsk.h network_helpers.h \
-			   prog_tests/test_xsk.h test_progs.h bpf_util.h \
-			   $(OUTPUT)/xsk_xdp_progs.skel.h $(BPFOBJ) | $(OUTPUT)
-	$(call msg,BINARY,,$@)
-	$(Q)$(CC) $(CFLAGS) $(filter %.a %.o %.c,$^) $(LDLIBS) -o $@
-
-$(OUTPUT)/xdp_hw_metadata: xdp_hw_metadata.c xsk.c network_helpers.c \
+$(OUTPUT)/xdp_hw_metadata: xdp_hw_metadata.c ../net/lib/xsk/xsk.c network_helpers.c \
 			   $(TOOLSDIR)/lib/find_bit.c xdp_metadata.h \
-			   xsk.h network_helpers.h test_progs.h bpf_util.h \
+			   ../net/lib/xsk/xsk.h network_helpers.h test_progs.h bpf_util.h \
 			   $(OUTPUT)/xdp_hw_metadata.skel.h $(BPFOBJ) | $(OUTPUT)
 	$(call msg,BINARY,,$@)
 	$(Q)$(CC) $(CFLAGS) $(filter %.a %.o %.c,$^) $(LDLIBS) -o $@
diff --git a/tools/testing/selftests/bpf/Makefile.buildvars b/tools/testing/selftests/bpf/Makefile.buildvars
index d2a0c0031b87..7e0dc8fa67cd 100644
--- a/tools/testing/selftests/bpf/Makefile.buildvars
+++ b/tools/testing/selftests/bpf/Makefile.buildvars
@@ -74,7 +74,8 @@ COMMON_CFLAGS = -g $(OPT_FLAGS) -rdynamic -std=gnu11				\
 	  $(GENFLAGS) $(SAN_CFLAGS) $(LIBELF_CFLAGS)			\
 	  -I$(CURDIR) -I$(INCLUDE_DIR) -I$(GENDIR) -I$(LIBDIR)		\
 	  -I$(TOOLSINCDIR) -I$(TOOLSARCHINCDIR) -I$(APIDIR) -I$(OUTPUT)	\
-	  -I$(CURDIR)/libarena/include
+	  -I$(CURDIR)/libarena/include					\
+	  -I$(CURDIR)/../net/lib/xsk
 LDLIBS += $(LIBELF_LIBS) -lz -lrt -lpthread
 
 PCAP_CFLAGS	:= $(shell $(PKG_CONFIG) --cflags libpcap 2>/dev/null && echo "-DTRAFFIC_MONITOR=1")
@@ -156,7 +157,6 @@ RUNNER_OBJS-test_progs := $(addprefix $(OUTPUT)/,			\
 	cap_helpers.o unpriv_helpers.o sysctl_helpers.o			\
 	netlink_helpers.o jit_disasm_helpers.o io_helpers.o		\
 	test_loader.o xsk.o disasm.o disasm_helpers.o			\
-	json_writer.o bpftool_helpers.o usdt_1.o usdt_2.o		\
-	find_bit.o)
+	json_writer.o bpftool_helpers.o usdt_1.o usdt_2.o)
 RUNNER_OBJS-test_maps := $(addprefix $(OUTPUT)/,			\
 	test_maps.o testing_helpers.o)
diff --git a/tools/testing/selftests/bpf/network_helpers.c b/tools/testing/selftests/bpf/network_helpers.c
index d27dc79475de..70c6e4271ca1 100644
--- a/tools/testing/selftests/bpf/network_helpers.c
+++ b/tools/testing/selftests/bpf/network_helpers.c
@@ -646,54 +646,6 @@ int get_socket_local_port(int sock_fd)
 	return -1;
 }
 
-int get_hw_ring_size(char *ifname, struct ethtool_ringparam *ring_param)
-{
-	struct ifreq ifr = {0};
-	int sockfd, err;
-
-	sockfd = socket(AF_INET, SOCK_DGRAM, 0);
-	if (sockfd < 0)
-		return -errno;
-
-	memcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
-
-	ring_param->cmd = ETHTOOL_GRINGPARAM;
-	ifr.ifr_data = (char *)ring_param;
-
-	if (ioctl(sockfd, SIOCETHTOOL, &ifr) < 0) {
-		err = errno;
-		close(sockfd);
-		return -err;
-	}
-
-	close(sockfd);
-	return 0;
-}
-
-int set_hw_ring_size(char *ifname, struct ethtool_ringparam *ring_param)
-{
-	struct ifreq ifr = {0};
-	int sockfd, err;
-
-	sockfd = socket(AF_INET, SOCK_DGRAM, 0);
-	if (sockfd < 0)
-		return -errno;
-
-	memcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
-
-	ring_param->cmd = ETHTOOL_SRINGPARAM;
-	ifr.ifr_data = (char *)ring_param;
-
-	if (ioctl(sockfd, SIOCETHTOOL, &ifr) < 0) {
-		err = errno;
-		close(sockfd);
-		return -err;
-	}
-
-	close(sockfd);
-	return 0;
-}
-
 struct send_recv_arg {
 	int		fd;
 	uint32_t	bytes;
diff --git a/tools/testing/selftests/bpf/network_helpers.h b/tools/testing/selftests/bpf/network_helpers.h
index 878c9fc5c37c..c7a1fd119e37 100644
--- a/tools/testing/selftests/bpf/network_helpers.h
+++ b/tools/testing/selftests/bpf/network_helpers.h
@@ -89,8 +89,6 @@ int make_sockaddr(int family, const char *addr_str, __u16 port,
 		  struct sockaddr_storage *addr, socklen_t *len);
 char *ping_command(int family);
 int get_socket_local_port(int sock_fd);
-int get_hw_ring_size(char *ifname, struct ethtool_ringparam *ring_param);
-int set_hw_ring_size(char *ifname, struct ethtool_ringparam *ring_param);
 
 int open_tuntap(const char *dev_name, bool need_mac);
 
diff --git a/tools/testing/selftests/net/Makefile b/tools/testing/selftests/net/Makefile
index 9180b9bec515..7dba412401ea 100644
--- a/tools/testing/selftests/net/Makefile
+++ b/tools/testing/selftests/net/Makefile
@@ -140,6 +140,7 @@ TEST_PROGS := \
 # end of TEST_PROGS
 
 TEST_PROGS_EXTENDED := \
+	test_xsk.sh \
 	xfrm_policy_add_speed.sh \
 # end of TEST_PROGS_EXTENDED
 
@@ -210,6 +211,7 @@ TEST_FILES := \
 	in_netns.sh \
 	lib.sh \
 	settings \
+	xsk_prereqs.sh \
 # end of TEST_FILES
 
 # YNL files, must be before "include ..lib.mk"
diff --git a/tools/testing/selftests/net/config b/tools/testing/selftests/net/config
index 7a89e2618d4c..162df07f84e1 100644
--- a/tools/testing/selftests/net/config
+++ b/tools/testing/selftests/net/config
@@ -141,5 +141,6 @@ CONFIG_USER_NS=y
 CONFIG_VETH=y
 CONFIG_VLAN_8021Q=y
 CONFIG_VXLAN=m
+CONFIG_XDP_SOCKETS=y
 CONFIG_XFRM_INTERFACE=m
 CONFIG_XFRM_USER=m
diff --git a/tools/testing/selftests/net/lib/.gitignore b/tools/testing/selftests/net/lib/.gitignore
index 6cd2b762af5d..1106fef3041f 100644
--- a/tools/testing/selftests/net/lib/.gitignore
+++ b/tools/testing/selftests/net/lib/.gitignore
@@ -2,3 +2,5 @@
 csum
 gro
 xdp_helper
+xsk_xdp_progs.skel.h
+xskxceiver
diff --git a/tools/testing/selftests/net/lib/Makefile b/tools/testing/selftests/net/lib/Makefile
index ff83603397d0..0a6cd733883d 100644
--- a/tools/testing/selftests/net/lib/Makefile
+++ b/tools/testing/selftests/net/lib/Makefile
@@ -5,6 +5,15 @@ CFLAGS += -I../../../../../usr/include/ $(KHDR_INCLUDES)
 # Additional include paths needed by kselftest.h
 CFLAGS += -I../../
 
+# xskxceiver needs a working bpftool to generate its skeleton
+BPFTOOL ?= bpftool
+HAS_BPFTOOL := $(shell $(BPFTOOL) version >/dev/null 2>&1 && echo y)
+ifeq ($(HAS_BPFTOOL),y)
+COND_GEN_FILES += xskxceiver
+else
+$(warning excluding xskxceiver, bpftool not installed or not working)
+endif
+
 TEST_FILES := \
 	../../../../net/ynl \
 	../../../../../Documentation/netlink/specs \
@@ -13,6 +22,7 @@ TEST_FILES := \
 
 TEST_GEN_FILES := \
 	$(patsubst %.c,%.o,$(wildcard *.bpf.c)) \
+	$(COND_GEN_FILES) \
 	csum \
 	gro \
 	xdp_helper \
@@ -22,4 +32,19 @@ TEST_INCLUDES := $(wildcard py/*.py sh/*.sh)
 
 include ../../lib.mk
 
+BPF_PROG_DIRS := xsk
 include ../bpf.mk
+
+# AF_XDP test engine used by net/test_xsk.sh.
+XSK_SRCS := $(filter-out %.bpf.c,$(wildcard xsk/*.c)) \
+	$(top_srcdir)/tools/lib/find_bit.c
+
+$(OUTPUT)/xskxceiver: $(XSK_SRCS) $(wildcard xsk/*.h) \
+		      $(OUTPUT)/xsk_xdp_progs.skel.h $(BPFOBJ)
+	$(call msg,CC,,$@)
+	$(Q)$(CC) -I$(top_srcdir)/tools/include $(CFLAGS) -I$(OUTPUT) \
+		-I$(SCRATCH_DIR)/include \
+		$(XSK_SRCS) $(BPFOBJ) $(LDLIBS) -lelf -lz -lpthread -o $@
+
+# TEST_GEN_FILES lacks xskxceiver when bpftool fails; clean it anyway.
+EXTRA_CLEAN += $(OUTPUT)/xskxceiver
diff --git a/tools/testing/selftests/bpf/prog_tests/test_xsk.c b/tools/testing/selftests/net/lib/xsk/test_xsk.c
similarity index 99%
rename from tools/testing/selftests/bpf/prog_tests/test_xsk.c
rename to tools/testing/selftests/net/lib/xsk/test_xsk.c
index 4549358cc8c2..ca161511f1e5 100644
--- a/tools/testing/selftests/bpf/prog_tests/test_xsk.c
+++ b/tools/testing/selftests/net/lib/xsk/test_xsk.c
@@ -1,4 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
+#include <arpa/inet.h>
 #include <bpf/bpf.h>
 #include <errno.h>
 #include <linux/bitmap.h>
@@ -13,7 +14,6 @@
 #include <sys/time.h>
 #include <unistd.h>
 
-#include "network_helpers.h"
 #include "test_xsk.h"
 #include "xsk_xdp_common.h"
 #include "xsk_xdp_progs.skel.h"
diff --git a/tools/testing/selftests/bpf/prog_tests/test_xsk.h b/tools/testing/selftests/net/lib/xsk/test_xsk.h
similarity index 99%
rename from tools/testing/selftests/bpf/prog_tests/test_xsk.h
rename to tools/testing/selftests/net/lib/xsk/test_xsk.h
index 69158b67466c..2506b0dcc6bf 100644
--- a/tools/testing/selftests/bpf/prog_tests/test_xsk.h
+++ b/tools/testing/selftests/net/lib/xsk/test_xsk.h
@@ -5,7 +5,7 @@
 #include <linux/ethtool.h>
 #include <linux/if_xdp.h>
 
-#include "../kselftest.h"
+#include "kselftest.h"
 #include "xsk.h"
 
 #ifndef SO_PREFER_BUSY_POLL
diff --git a/tools/testing/selftests/bpf/xsk.c b/tools/testing/selftests/net/lib/xsk/xsk.c
similarity index 95%
rename from tools/testing/selftests/bpf/xsk.c
rename to tools/testing/selftests/net/lib/xsk/xsk.c
index 25d568abf0f2..6bd32caf5d08 100644
--- a/tools/testing/selftests/bpf/xsk.c
+++ b/tools/testing/selftests/net/lib/xsk/xsk.c
@@ -35,7 +35,6 @@
 #include <bpf/bpf.h>
 #include <bpf/libbpf.h>
 #include "xsk.h"
-#include "bpf_util.h"
 
 #ifndef SOL_XDP
  #define SOL_XDP 283
@@ -779,3 +778,51 @@ void xsk_socket__delete(struct xsk_socket *xsk)
 		close(xsk->fd);
 	free(xsk);
 }
+
+int get_hw_ring_size(char *ifname, struct ethtool_ringparam *ring_param)
+{
+	struct ifreq ifr = {0};
+	int sockfd, err;
+
+	sockfd = socket(AF_INET, SOCK_DGRAM, 0);
+	if (sockfd < 0)
+		return -errno;
+
+	memcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
+
+	ring_param->cmd = ETHTOOL_GRINGPARAM;
+	ifr.ifr_data = (char *)ring_param;
+
+	if (ioctl(sockfd, SIOCETHTOOL, &ifr) < 0) {
+		err = errno;
+		close(sockfd);
+		return -err;
+	}
+
+	close(sockfd);
+	return 0;
+}
+
+int set_hw_ring_size(char *ifname, struct ethtool_ringparam *ring_param)
+{
+	struct ifreq ifr = {0};
+	int sockfd, err;
+
+	sockfd = socket(AF_INET, SOCK_DGRAM, 0);
+	if (sockfd < 0)
+		return -errno;
+
+	memcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
+
+	ring_param->cmd = ETHTOOL_SRINGPARAM;
+	ifr.ifr_data = (char *)ring_param;
+
+	if (ioctl(sockfd, SIOCETHTOOL, &ifr) < 0) {
+		err = errno;
+		close(sockfd);
+		return -err;
+	}
+
+	close(sockfd);
+	return 0;
+}
diff --git a/tools/testing/selftests/bpf/xsk.h b/tools/testing/selftests/net/lib/xsk/xsk.h
similarity index 97%
rename from tools/testing/selftests/bpf/xsk.h
rename to tools/testing/selftests/net/lib/xsk/xsk.h
index 48729da142c2..3f1fea999763 100644
--- a/tools/testing/selftests/bpf/xsk.h
+++ b/tools/testing/selftests/net/lib/xsk/xsk.h
@@ -15,6 +15,7 @@
 #include <stdio.h>
 #include <stdint.h>
 #include <stdbool.h>
+#include <linux/ethtool.h>
 #include <linux/if_xdp.h>
 
 #include <bpf/libbpf.h>
@@ -242,6 +243,9 @@ void xsk_socket__delete(struct xsk_socket *xsk);
 
 int xsk_set_mtu(int ifindex, int mtu);
 
+int get_hw_ring_size(char *ifname, struct ethtool_ringparam *ring_param);
+int set_hw_ring_size(char *ifname, struct ethtool_ringparam *ring_param);
+
 #ifdef __cplusplus
 } /* extern "C" */
 #endif
diff --git a/tools/testing/selftests/bpf/xsk_xdp_common.h b/tools/testing/selftests/net/lib/xsk/xsk_xdp_common.h
similarity index 100%
rename from tools/testing/selftests/bpf/xsk_xdp_common.h
rename to tools/testing/selftests/net/lib/xsk/xsk_xdp_common.h
diff --git a/tools/testing/selftests/bpf/progs/xsk_xdp_progs.c b/tools/testing/selftests/net/lib/xsk/xsk_xdp_progs.bpf.c
similarity index 98%
rename from tools/testing/selftests/bpf/progs/xsk_xdp_progs.c
rename to tools/testing/selftests/net/lib/xsk/xsk_xdp_progs.bpf.c
index 023d8befd4ca..84e5f4732289 100644
--- a/tools/testing/selftests/bpf/progs/xsk_xdp_progs.c
+++ b/tools/testing/selftests/net/lib/xsk/xsk_xdp_progs.bpf.c
@@ -64,7 +64,7 @@ SEC("xdp") int xsk_xdp_shared_umem(struct xdp_md *xdp)
 	void *data_end = (void *)(long)xdp->data_end;
 	struct ethhdr *eth = data;
 
-	if (eth + 1 > data_end)
+	if ((void *)(eth + 1) > data_end)
 		return XDP_DROP;
 
 	/* Redirecting packets based on the destination MAC address */
diff --git a/tools/testing/selftests/bpf/xskxceiver.c b/tools/testing/selftests/net/lib/xsk/xskxceiver.c
similarity index 99%
rename from tools/testing/selftests/bpf/xskxceiver.c
rename to tools/testing/selftests/net/lib/xsk/xskxceiver.c
index 6cf95a44c8c0..0a63651434a5 100644
--- a/tools/testing/selftests/bpf/xskxceiver.c
+++ b/tools/testing/selftests/net/lib/xsk/xskxceiver.c
@@ -81,6 +81,7 @@
 #include <linux/netdev.h>
 #include <linux/ethtool.h>
 #include <linux/align.h>
+#include <linux/kernel.h>
 #include <arpa/inet.h>
 #include <net/if.h>
 #include <locale.h>
@@ -91,7 +92,7 @@
 #include <sys/mman.h>
 #include <sys/types.h>
 
-#include "prog_tests/test_xsk.h"
+#include "test_xsk.h"
 #include "xsk_xdp_progs.skel.h"
 #include "xsk.h"
 #include "xskxceiver.h"
@@ -100,14 +101,10 @@
 #include "kselftest.h"
 #include "xsk_xdp_common.h"
 
-#include <network_helpers.h>
-
 static bool opt_print_tests;
 static enum test_mode opt_mode = TEST_MODE_ALL;
 static u32 opt_run_test = RUN_ALL_TESTS;
 
-void test__fail(void) { /* for network_helpers.c */ }
-
 static void __exit_with_error(int error, const char *file, const char *func, int line)
 {
 	ksft_test_result_fail("[%s:%s:%i]: ERROR: %d/\"%s\"\n", file, func, line,
diff --git a/tools/testing/selftests/bpf/xskxceiver.h b/tools/testing/selftests/net/lib/xsk/xskxceiver.h
similarity index 100%
rename from tools/testing/selftests/bpf/xskxceiver.h
rename to tools/testing/selftests/net/lib/xsk/xskxceiver.h
diff --git a/tools/testing/selftests/bpf/test_xsk.sh b/tools/testing/selftests/net/test_xsk.sh
similarity index 98%
rename from tools/testing/selftests/bpf/test_xsk.sh
rename to tools/testing/selftests/net/test_xsk.sh
index 62db060298a4..448cd2462278 100755
--- a/tools/testing/selftests/bpf/test_xsk.sh
+++ b/tools/testing/selftests/net/test_xsk.sh
@@ -103,6 +103,11 @@ do
 	esac
 done
 
+if [ ! -x "./${XSKOBJ}" ]; then
+	echo "xskxceiver was not built; skipping"
+	exit $ksft_skip
+fi
+
 TEST_NAME="PREREQUISITES"
 
 URANDOM=/dev/urandom
diff --git a/tools/testing/selftests/bpf/xsk_prereqs.sh b/tools/testing/selftests/net/xsk_prereqs.sh
similarity index 98%
rename from tools/testing/selftests/bpf/xsk_prereqs.sh
rename to tools/testing/selftests/net/xsk_prereqs.sh
index 47c7b8064f38..d8fe786e967c 100755
--- a/tools/testing/selftests/bpf/xsk_prereqs.sh
+++ b/tools/testing/selftests/net/xsk_prereqs.sh
@@ -8,7 +8,7 @@ ksft_xfail=2
 ksft_xpass=3
 ksft_skip=4
 
-XSKOBJ=xskxceiver
+XSKOBJ=lib/xskxceiver
 
 validate_root_exec()
 {
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH net-next 4/4] selftests: net: move xdp_hw_metadata from selftests/bpf
  2026-11-05 13:41 [PATCH net-next 0/4] selftests: move the AF_XDP test suite from bpf to net Maciej Fijalkowski
                   ` (2 preceding siblings ...)
  2026-11-05 13:41 ` [PATCH net-next 3/4] selftests: xsk: move the AF_XDP test suite to selftests/net Maciej Fijalkowski
@ 2026-11-05 13:41 ` Maciej Fijalkowski
  2026-11-05 20:43 ` [PATCH net-next 0/4] selftests: move the AF_XDP test suite from bpf to net Stanislav Fomichev
  4 siblings, 0 replies; 9+ messages in thread
From: Maciej Fijalkowski @ 2026-11-05 13:41 UTC (permalink / raw)
  To: netdev
  Cc: magnus.karlsson, stfomichev, kuba, pabeni, tushar.vyavahare,
	kerneljasonxing, bjorn, Maciej Fijalkowski

Move xdp_hw_metadata and its XDP program to selftests/net, next to the
AF_XDP library in net/lib/xsk that the tool is built from.

The tool used test_progs and network_helpers only for start_server(),
two checksum helpers and strscpy(). Open the UDP socket with a local
helper, copy csum_tcpudp_magic() and csum_ipv6_magic(), and fill
ifr_name with snprintf(). Build the XDP program against the uapi
headers rather than vmlinux.h: mirror struct vlan_hdr and enum
xdp_rss_hash_type, and cast to void * in the bound checks.

Build the tool only when bpftool works, and install it without running
it, as it needs a NIC and a peer that sends it traffic. Copy
xdp_metadata.h rather than move it, as the xdp_metadata test in
test_progs still uses it. Update xsk-tx-metadata.rst and the XDP entry
of MAINTAINERS.

Signed-off-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
---
 Documentation/networking/xsk-tx-metadata.rst  |  2 +-
 MAINTAINERS                                   |  1 +
 tools/testing/selftests/bpf/.gitignore        |  1 -
 tools/testing/selftests/bpf/Makefile          |  8 --
 tools/testing/selftests/net/.gitignore        |  2 +
 tools/testing/selftests/net/Makefile          | 18 +++++
 .../xdp_hw_metadata.bpf.c}                    | 35 +++++---
 .../selftests/{bpf => net}/xdp_hw_metadata.c  | 81 +++++++++++++++++--
 tools/testing/selftests/net/xdp_metadata.h    | 67 +++++++++++++++
 9 files changed, 188 insertions(+), 27 deletions(-)
 rename tools/testing/selftests/{bpf/progs/xdp_hw_metadata.c => net/xdp_hw_metadata.bpf.c} (75%)
 rename tools/testing/selftests/{bpf => net}/xdp_hw_metadata.c (92%)
 create mode 100644 tools/testing/selftests/net/xdp_metadata.h

diff --git a/Documentation/networking/xsk-tx-metadata.rst b/Documentation/networking/xsk-tx-metadata.rst
index f240930ca1df..ac15e5fddc6b 100644
--- a/Documentation/networking/xsk-tx-metadata.rst
+++ b/Documentation/networking/xsk-tx-metadata.rst
@@ -144,6 +144,6 @@ See ``tools/net/ynl/samples/netdev.c`` on how to query this information.
 Example
 =======
 
-See ``tools/testing/selftests/bpf/xdp_hw_metadata.c`` for an example
+See ``tools/testing/selftests/net/xdp_hw_metadata.c`` for an example
 program that handles TX metadata. Also see https://github.com/fomichev/xskgen
 for a more bare-bones example.
diff --git a/MAINTAINERS b/MAINTAINERS
index 12e444f1f7a6..2123857f3365 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -30418,6 +30418,7 @@ F:	net/core/xdp.c
 F:	samples/bpf/xdp*
 F:	tools/testing/selftests/bpf/*/*xdp*
 F:	tools/testing/selftests/bpf/*xdp*
+F:	tools/testing/selftests/net/*xdp*
 K:	(?:\b|_)xdp(?:\b|_)
 
 XDP SOCKETS (AF_XDP)
diff --git a/tools/testing/selftests/bpf/.gitignore b/tools/testing/selftests/bpf/.gitignore
index cd098c0271ef..e318a38035d2 100644
--- a/tools/testing/selftests/bpf/.gitignore
+++ b/tools/testing/selftests/bpf/.gitignore
@@ -38,7 +38,6 @@ test_cpp
 *.tmp
 xdp_redirect_multi
 xdp_synproxy
-xdp_hw_metadata
 xdp_features
 verification_cert.h
 *.BTF
diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile
index 203f2cedaf77..2d46e47bab60 100644
--- a/tools/testing/selftests/bpf/Makefile
+++ b/tools/testing/selftests/bpf/Makefile
@@ -56,7 +56,6 @@ TEST_GEN_PROGS_EXTENDED = \
 	test_cpp \
 	veristat \
 	xdp_features \
-	xdp_hw_metadata \
 	xdp_synproxy
 
 TEST_GEN_FILES += $(TEST_KMODS) liburandom_read.so urandom_read sign-file uprobe_multi
@@ -568,13 +567,6 @@ $(OUTPUT)/test_verifier: test_verifier.c verifier/tests.h $(BPFOBJ) | $(OUTPUT)
 	$(call msg,BINARY,,$@)
 	$(Q)$(CC) $(CFLAGS) $(filter %.a %.o %.c,$^) $(LDLIBS) -o $@
 
-$(OUTPUT)/xdp_hw_metadata: xdp_hw_metadata.c ../net/lib/xsk/xsk.c network_helpers.c \
-			   $(TOOLSDIR)/lib/find_bit.c xdp_metadata.h \
-			   ../net/lib/xsk/xsk.h network_helpers.h test_progs.h bpf_util.h \
-			   $(OUTPUT)/xdp_hw_metadata.skel.h $(BPFOBJ) | $(OUTPUT)
-	$(call msg,BINARY,,$@)
-	$(Q)$(CC) $(CFLAGS) $(filter %.a %.o %.c,$^) $(LDLIBS) -o $@
-
 $(OUTPUT)/xdp_features: xdp_features.c network_helpers.c xdp_features.h \
 			   network_helpers.h \
 			   test_progs.h bpf_util.h $(OUTPUT)/xdp_features.skel.h \
diff --git a/tools/testing/selftests/net/.gitignore b/tools/testing/selftests/net/.gitignore
index 21412510ac26..0bd88b48a53c 100644
--- a/tools/testing/selftests/net/.gitignore
+++ b/tools/testing/selftests/net/.gitignore
@@ -60,3 +60,5 @@ udp_splice_checksum
 udpgso
 udpgso_bench_rx
 udpgso_bench_tx
+xdp_hw_metadata
+xdp_hw_metadata.skel.h
diff --git a/tools/testing/selftests/net/Makefile b/tools/testing/selftests/net/Makefile
index 7dba412401ea..9925360a9a98 100644
--- a/tools/testing/selftests/net/Makefile
+++ b/tools/testing/selftests/net/Makefile
@@ -226,6 +226,15 @@ TEST_GEN_PROGS += $(YNL_GEN_PROGS)
 
 TEST_GEN_FILES += $(patsubst %.c,%.o,$(wildcard *.bpf.c))
 
+# xdp_hw_metadata needs a working bpftool to generate its skeleton
+BPFTOOL ?= bpftool
+HAS_BPFTOOL := $(shell $(BPFTOOL) version >/dev/null 2>&1 && echo y)
+ifeq ($(HAS_BPFTOOL),y)
+TEST_GEN_FILES += xdp_hw_metadata
+else
+$(warning excluding xdp_hw_metadata, bpftool not installed or not working)
+endif
+
 TEST_INCLUDES := forwarding/lib.sh
 
 include ../lib.mk
@@ -249,3 +258,12 @@ $(OUTPUT)/bind_bhash: LDLIBS += -lpthread
 $(OUTPUT)/io_uring_zerocopy_tx: CFLAGS += -I../../../include/
 
 include bpf.mk
+
+# Reference tool for checking XDP RX/TX metadata on real HW, built with
+# the AF_XDP library of net/lib/xsk.
+$(OUTPUT)/xdp_hw_metadata: xdp_hw_metadata.c xdp_metadata.h lib/xsk/xsk.c \
+			   lib/xsk/xsk.h $(OUTPUT)/xdp_hw_metadata.skel.h $(BPFOBJ)
+	$(call msg,CC,,$@)
+	$(Q)$(CC) -I$(top_srcdir)/tools/include $(CFLAGS) -I$(OUTPUT) \
+		-I$(SCRATCH_DIR)/include \
+		$(filter %.c,$^) $(BPFOBJ) $(LDLIBS) -lelf -lz -o $@
diff --git a/tools/testing/selftests/bpf/progs/xdp_hw_metadata.c b/tools/testing/selftests/net/xdp_hw_metadata.bpf.c
similarity index 75%
rename from tools/testing/selftests/bpf/progs/xdp_hw_metadata.c
rename to tools/testing/selftests/net/xdp_hw_metadata.bpf.c
index 330ece2eabdb..a183436646b1 100644
--- a/tools/testing/selftests/bpf/progs/xdp_hw_metadata.c
+++ b/tools/testing/selftests/net/xdp_hw_metadata.bpf.c
@@ -1,10 +1,23 @@
 // SPDX-License-Identifier: GPL-2.0
 
-#include <vmlinux.h>
+#include <linux/bpf.h>
+#include <linux/if_ether.h>
+#include <linux/in.h>
+#include <linux/ip.h>
+#include <linux/ipv6.h>
+#include <linux/udp.h>
 #include "xdp_metadata.h"
 #include <bpf/bpf_helpers.h>
 #include <bpf/bpf_endian.h>
 
+/* Mirror of struct vlan_hdr from include/linux/if_vlan.h, which is not
+ * part of the UAPI headers.
+ */
+struct vlan_hdr {
+	__be16 h_vlan_TCI;
+	__be16 h_vlan_encapsulated_proto;
+};
+
 struct {
 	__uint(type, BPF_MAP_TYPE_XSKMAP);
 	__uint(max_entries, 256);
@@ -39,25 +52,29 @@ int rx(struct xdp_md *ctx)
 	data_end = (void *)(long)ctx->data_end;
 	eth = data;
 
-	if (eth + 1 < data_end && (eth->h_proto == bpf_htons(ETH_P_8021AD) ||
-				   eth->h_proto == bpf_htons(ETH_P_8021Q)))
+	if ((void *)(eth + 1) < data_end &&
+	    (eth->h_proto == bpf_htons(ETH_P_8021AD) ||
+	     eth->h_proto == bpf_htons(ETH_P_8021Q)))
 		eth = (void *)eth + sizeof(struct vlan_hdr);
 
-	if (eth + 1 < data_end && eth->h_proto == bpf_htons(ETH_P_8021Q))
+	if ((void *)(eth + 1) < data_end &&
+	    eth->h_proto == bpf_htons(ETH_P_8021Q))
 		eth = (void *)eth + sizeof(struct vlan_hdr);
 
-	if (eth + 1 < data_end) {
+	if ((void *)(eth + 1) < data_end) {
 		if (eth->h_proto == bpf_htons(ETH_P_IP)) {
 			iph = (void *)(eth + 1);
-			if (iph + 1 < data_end && iph->protocol == IPPROTO_UDP)
+			if ((void *)(iph + 1) < data_end &&
+			    iph->protocol == IPPROTO_UDP)
 				udp = (void *)(iph + 1);
 		}
 		if (eth->h_proto == bpf_htons(ETH_P_IPV6)) {
 			ip6h = (void *)(eth + 1);
-			if (ip6h + 1 < data_end && ip6h->nexthdr == IPPROTO_UDP)
+			if ((void *)(ip6h + 1) < data_end &&
+			    ip6h->nexthdr == IPPROTO_UDP)
 				udp = (void *)(ip6h + 1);
 		}
-		if (udp && udp + 1 > data_end)
+		if (udp && (void *)(udp + 1) > data_end)
 			udp = NULL;
 	}
 
@@ -82,7 +99,7 @@ int rx(struct xdp_md *ctx)
 	data_meta = (void *)(long)ctx->data_meta;
 	meta = data_meta;
 
-	if (meta + 1 > data) {
+	if ((void *)(meta + 1) > data) {
 		__sync_add_and_fetch(&pkts_fail, 1);
 		return XDP_PASS;
 	}
diff --git a/tools/testing/selftests/bpf/xdp_hw_metadata.c b/tools/testing/selftests/net/xdp_hw_metadata.c
similarity index 92%
rename from tools/testing/selftests/bpf/xdp_hw_metadata.c
rename to tools/testing/selftests/net/xdp_hw_metadata.c
index ab3f5fc56e86..6db928f1ffdc 100644
--- a/tools/testing/selftests/bpf/xdp_hw_metadata.c
+++ b/tools/testing/selftests/net/xdp_hw_metadata.c
@@ -16,11 +16,11 @@
  * - TX launch time HW offload is requested for transmission
  */
 
-#include <test_progs.h>
-#include <network_helpers.h>
 #include "xdp_hw_metadata.skel.h"
-#include "xsk.h"
+#include "lib/xsk/xsk.h"
 
+#include <bpf/bpf.h>
+#include <errno.h>
 #include <error.h>
 #include <linux/kernel.h>
 #include <linux/bits.h>
@@ -47,6 +47,9 @@
 #include <linux/ethtool.h>
 #include <sys/socket.h>
 #include <arpa/inet.h>
+#include <linux/ip.h>
+#include <linux/ipv6.h>
+#include <signal.h>
 
 #include "xdp_metadata.h"
 
@@ -87,7 +90,69 @@ int launch_time_queue;
 	system(command);					\
 })
 
-void test__fail(void) { /* for network_helpers.c */ }
+static __u16 csum_fold(__u32 csum)
+{
+	csum = (csum & 0xffff) + (csum >> 16);
+	csum = (csum & 0xffff) + (csum >> 16);
+
+	return (__u16)~csum;
+}
+
+static __sum16 csum_tcpudp_magic(__be32 saddr, __be32 daddr, __u32 len,
+				 __u8 proto, __wsum csum)
+{
+	__u64 s = csum;
+
+	s += (__u32)saddr;
+	s += (__u32)daddr;
+	s += htons(proto + len);
+	s = (s & 0xffffffff) + (s >> 32);
+	s = (s & 0xffffffff) + (s >> 32);
+
+	return csum_fold((__u32)s);
+}
+
+static __sum16 csum_ipv6_magic(const struct in6_addr *saddr,
+			       const struct in6_addr *daddr, __u32 len,
+			       __u8 proto, __wsum csum)
+{
+	__u64 s = csum;
+	int i;
+
+	for (i = 0; i < 4; i++)
+		s += (__u32)saddr->s6_addr32[i];
+	for (i = 0; i < 4; i++)
+		s += (__u32)daddr->s6_addr32[i];
+	s += htons(proto + len);
+	s = (s & 0xffffffff) + (s >> 32);
+	s = (s & 0xffffffff) + (s >> 32);
+
+	return csum_fold((__u32)s);
+}
+
+static int open_udp_server(__u16 port)
+{
+	struct sockaddr_in6 addr = {
+		.sin6_family = AF_INET6,
+		.sin6_port = htons(port),
+		.sin6_addr = IN6ADDR_ANY_INIT,
+	};
+	struct timeval timeo = { .tv_sec = 1 };
+	int fd;
+
+	fd = socket(AF_INET6, SOCK_DGRAM, 0);
+	if (fd < 0)
+		return -1;
+
+	if (setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &timeo, sizeof(timeo)) ||
+	    setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &timeo, sizeof(timeo)) ||
+	    bind(fd, (struct sockaddr *)&addr, sizeof(addr))) {
+		close(fd);
+		return -1;
+	}
+
+	return fd;
+}
 
 static int open_xsk(int ifindex, struct xsk *xsk, __u32 queue_id)
 {
@@ -550,7 +615,7 @@ static int rxq_num(const char *ifname)
 	struct ifreq ifr = {
 		.ifr_data = (void *)&ch,
 	};
-	strscpy(ifr.ifr_name, ifname);
+	snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s", ifname);
 	int fd, ret;
 
 	fd = socket(AF_UNIX, SOCK_DGRAM, 0);
@@ -571,7 +636,7 @@ static void hwtstamp_ioctl(int op, const char *ifname, struct hwtstamp_config *c
 	struct ifreq ifr = {
 		.ifr_data = (void *)cfg,
 	};
-	strscpy(ifr.ifr_name, ifname);
+	snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s", ifname);
 	int fd, ret;
 
 	fd = socket(AF_UNIX, SOCK_DGRAM, 0);
@@ -853,9 +918,9 @@ int main(int argc, char *argv[])
 		error(1, -ret, "xdp_hw_metadata__load");
 
 	printf("prepare skb endpoint...\n");
-	server_fd = start_server(AF_INET6, SOCK_DGRAM, NULL, 9092, 1000);
+	server_fd = open_udp_server(9092);
 	if (server_fd < 0)
-		error(1, errno, "start_server");
+		error(1, errno, "open_udp_server");
 	timestamping_enable(server_fd,
 			    SOF_TIMESTAMPING_SOFTWARE |
 			    SOF_TIMESTAMPING_RAW_HARDWARE);
diff --git a/tools/testing/selftests/net/xdp_metadata.h b/tools/testing/selftests/net/xdp_metadata.h
new file mode 100644
index 000000000000..9371889f76d3
--- /dev/null
+++ b/tools/testing/selftests/net/xdp_metadata.h
@@ -0,0 +1,67 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#pragma once
+
+#ifndef ETH_P_IP
+#define ETH_P_IP 0x0800
+#endif
+
+#ifndef ETH_P_IPV6
+#define ETH_P_IPV6 0x86DD
+#endif
+
+#ifndef ETH_P_8021Q
+#define ETH_P_8021Q 0x8100
+#endif
+
+#ifndef ETH_P_8021AD
+#define ETH_P_8021AD 0x88A8
+#endif
+
+#ifndef BIT
+#define BIT(nr)			(1 << (nr))
+#endif
+
+/* Non-existent checksum status */
+#define XDP_CHECKSUM_MAGIC	BIT(2)
+
+/* Mirror of enum xdp_rss_hash_type from include/net/xdp.h, which is not
+ * part of the UAPI headers.
+ */
+enum xdp_rss_hash_type {
+	XDP_RSS_L3_IPV4		= BIT(0),
+	XDP_RSS_L3_IPV6		= BIT(1),
+	XDP_RSS_L3_DYNHDR	= BIT(2),
+	XDP_RSS_L4		= BIT(3),
+	XDP_RSS_L4_TCP		= BIT(4),
+	XDP_RSS_L4_UDP		= BIT(5),
+	XDP_RSS_L4_SCTP		= BIT(6),
+	XDP_RSS_L4_IPSEC	= BIT(7),
+	XDP_RSS_L4_ICMP		= BIT(8),
+};
+
+enum xdp_meta_field {
+	XDP_META_FIELD_TS	= BIT(0),
+	XDP_META_FIELD_RSS	= BIT(1),
+	XDP_META_FIELD_VLAN_TAG	= BIT(2),
+};
+
+struct xdp_meta {
+	union {
+		__u64 rx_timestamp;
+		__s32 rx_timestamp_err;
+	};
+	__u64 xdp_timestamp;
+	__u32 rx_hash;
+	union {
+		__u32 rx_hash_type;
+		__s32 rx_hash_err;
+	};
+	union {
+		struct {
+			__be16 rx_vlan_proto;
+			__u16 rx_vlan_tci;
+		};
+		__s32 rx_vlan_tag_err;
+	};
+	enum xdp_meta_field hint_valid;
+};
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH net-next 0/4] selftests: move the AF_XDP test suite from bpf to net
  2026-11-05 13:41 [PATCH net-next 0/4] selftests: move the AF_XDP test suite from bpf to net Maciej Fijalkowski
                   ` (3 preceding siblings ...)
  2026-11-05 13:41 ` [PATCH net-next 4/4] selftests: net: move xdp_hw_metadata from selftests/bpf Maciej Fijalkowski
@ 2026-11-05 20:43 ` Stanislav Fomichev
  2026-11-09 12:44   ` Maciej Fijalkowski
  4 siblings, 1 reply; 9+ messages in thread
From: Stanislav Fomichev @ 2026-11-05 20:43 UTC (permalink / raw)
  To: Maciej Fijalkowski
  Cc: netdev, magnus.karlsson, stfomichev, kuba, pabeni,
	tushar.vyavahare, kerneljasonxing, bjorn

On 11/05, Maciej Fijalkowski wrote:
> Hi,
> 
> As the maintainers asked, this series is the first step of moving the
> AF_XDP selftests from selftests/bpf to selftests/net: the code moves and
> builds from its new location, without changing what the tests do. The
> rework [0] posted as "selftests: net: migrate AF_XDP test suite over to
> net" (v4) will follow on top of this move.
> 
> Patch 1 drops the test_progs wrapper of the AF_XDP tests, patch 2 adds a
> generic BPF skeleton rule to net/bpf.mk, patch 3 moves xskxceiver, its
> library and test_xsk.sh to selftests/net, and patch 4 (new, not covered
> at [0]) moves xdp_hw_metadata, which is built from the same library.
> 
> The xdp_metadata test stays in test_progs: it covers BPF core
> behaviour, and moving it would mean rewriting it for the kselftest
> harness. It keeps using xsk.c from net/lib/xsk.
> 
> xskxceiver and xdp_hw_metadata are the first users of bpftool at build
> time in selftests/net. NIPA has bpftool, but 0-day and KernelCI build
> net without it, so both tools are skipped with a warning when bpftool
> is missing or does not run.
> 
> test_xsk.sh is installed but not run by run_tests, so NIPA does not pick
> it up: it runs every case, including flaky ones, and some cases leak
> page_pool pages after skb_pp_cow_data() in generic XDP mode on
> veth-based runs. Until a later step makes the suite fit for NIPA, no CI
> runs the AF_XDP tests. test_xsk.sh is being removed by [0] but it is
> kept here as there is no other feasible way to run the test suite (if
> needed) until we come up with an upstreamable Python runner.
> 
> Thanks,
> Maciej
> 
> [0]: https://lore.kernel.org/bpf/20261016174338.787135-1-maciej.fijalkowski@intel.com/
> 
> Maciej Fijalkowski (4):
>   selftests/bpf: drop the test_progs AF_XDP wrapper
>   selftests: net: add a generic rule for BPF skeletons
>   selftests: xsk: move the AF_XDP test suite to selftests/net
>   selftests: net: move xdp_hw_metadata from selftests/bpf

Acked-by: Stanislav Fomichev <sdf@fomichev.me>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH net-next 0/4] selftests: move the AF_XDP test suite from bpf to net
  2026-11-05 20:43 ` [PATCH net-next 0/4] selftests: move the AF_XDP test suite from bpf to net Stanislav Fomichev
@ 2026-11-09 12:44   ` Maciej Fijalkowski
  2026-11-09 16:52     ` Stanislav Fomichev
  0 siblings, 1 reply; 9+ messages in thread
From: Maciej Fijalkowski @ 2026-11-09 12:44 UTC (permalink / raw)
  To: Stanislav Fomichev
  Cc: netdev, magnus.karlsson, stfomichev, kuba, pabeni,
	tushar.vyavahare, kerneljasonxing, bjorn

On Thu, Nov 05, 2026 at 12:43:36PM -0800, Stanislav Fomichev wrote:
> On 11/05, Maciej Fijalkowski wrote:
> > Hi,
> > 
> > As the maintainers asked, this series is the first step of moving the
> > AF_XDP selftests from selftests/bpf to selftests/net: the code moves and
> > builds from its new location, without changing what the tests do. The
> > rework [0] posted as "selftests: net: migrate AF_XDP test suite over to
> > net" (v4) will follow on top of this move.
> > 
> > Patch 1 drops the test_progs wrapper of the AF_XDP tests, patch 2 adds a
> > generic BPF skeleton rule to net/bpf.mk, patch 3 moves xskxceiver, its
> > library and test_xsk.sh to selftests/net, and patch 4 (new, not covered
> > at [0]) moves xdp_hw_metadata, which is built from the same library.
> > 
> > The xdp_metadata test stays in test_progs: it covers BPF core
> > behaviour, and moving it would mean rewriting it for the kselftest
> > harness. It keeps using xsk.c from net/lib/xsk.
> > 
> > xskxceiver and xdp_hw_metadata are the first users of bpftool at build
> > time in selftests/net. NIPA has bpftool, but 0-day and KernelCI build
> > net without it, so both tools are skipped with a warning when bpftool
> > is missing or does not run.
> > 
> > test_xsk.sh is installed but not run by run_tests, so NIPA does not pick
> > it up: it runs every case, including flaky ones, and some cases leak
> > page_pool pages after skb_pp_cow_data() in generic XDP mode on
> > veth-based runs. Until a later step makes the suite fit for NIPA, no CI
> > runs the AF_XDP tests. test_xsk.sh is being removed by [0] but it is
> > kept here as there is no other feasible way to run the test suite (if
> > needed) until we come up with an upstreamable Python runner.
> > 
> > Thanks,
> > Maciej
> > 
> > [0]: https://lore.kernel.org/bpf/20261016174338.787135-1-maciej.fijalkowski@intel.com/
> > 
> > Maciej Fijalkowski (4):
> >   selftests/bpf: drop the test_progs AF_XDP wrapper
> >   selftests: net: add a generic rule for BPF skeletons
> >   selftests: xsk: move the AF_XDP test suite to selftests/net
> >   selftests: net: move xdp_hw_metadata from selftests/bpf
> 
> Acked-by: Stanislav Fomichev <sdf@fomichev.me>

Thanks for acking! However for some reason clashiko missed this set, can
someone remind me what could be the case here?

I also see in SUIE that check_selftest failed - is it mandatory to repost
in this case?

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH net-next 0/4] selftests: move the AF_XDP test suite from bpf to net
  2026-11-09 12:44   ` Maciej Fijalkowski
@ 2026-11-09 16:52     ` Stanislav Fomichev
  2026-11-09 19:12       ` Maciej Fijalkowski
  0 siblings, 1 reply; 9+ messages in thread
From: Stanislav Fomichev @ 2026-11-09 16:52 UTC (permalink / raw)
  To: Maciej Fijalkowski
  Cc: netdev, magnus.karlsson, stfomichev, kuba, pabeni,
	tushar.vyavahare, kerneljasonxing, bjorn

On 11/09, Maciej Fijalkowski wrote:
> On Thu, Nov 05, 2026 at 12:43:36PM -0800, Stanislav Fomichev wrote:
> > On 11/05, Maciej Fijalkowski wrote:
> > > Hi,
> > > 
> > > As the maintainers asked, this series is the first step of moving the
> > > AF_XDP selftests from selftests/bpf to selftests/net: the code moves and
> > > builds from its new location, without changing what the tests do. The
> > > rework [0] posted as "selftests: net: migrate AF_XDP test suite over to
> > > net" (v4) will follow on top of this move.
> > > 
> > > Patch 1 drops the test_progs wrapper of the AF_XDP tests, patch 2 adds a
> > > generic BPF skeleton rule to net/bpf.mk, patch 3 moves xskxceiver, its
> > > library and test_xsk.sh to selftests/net, and patch 4 (new, not covered
> > > at [0]) moves xdp_hw_metadata, which is built from the same library.
> > > 
> > > The xdp_metadata test stays in test_progs: it covers BPF core
> > > behaviour, and moving it would mean rewriting it for the kselftest
> > > harness. It keeps using xsk.c from net/lib/xsk.
> > > 
> > > xskxceiver and xdp_hw_metadata are the first users of bpftool at build
> > > time in selftests/net. NIPA has bpftool, but 0-day and KernelCI build
> > > net without it, so both tools are skipped with a warning when bpftool
> > > is missing or does not run.
> > > 
> > > test_xsk.sh is installed but not run by run_tests, so NIPA does not pick
> > > it up: it runs every case, including flaky ones, and some cases leak
> > > page_pool pages after skb_pp_cow_data() in generic XDP mode on
> > > veth-based runs. Until a later step makes the suite fit for NIPA, no CI
> > > runs the AF_XDP tests. test_xsk.sh is being removed by [0] but it is
> > > kept here as there is no other feasible way to run the test suite (if
> > > needed) until we come up with an upstreamable Python runner.
> > > 
> > > Thanks,
> > > Maciej
> > > 
> > > [0]: https://lore.kernel.org/bpf/20261016174338.787135-1-maciej.fijalkowski@intel.com/
> > > 
> > > Maciej Fijalkowski (4):
> > >   selftests/bpf: drop the test_progs AF_XDP wrapper
> > >   selftests: net: add a generic rule for BPF skeletons
> > >   selftests: xsk: move the AF_XDP test suite to selftests/net
> > >   selftests: net: move xdp_hw_metadata from selftests/bpf
> > 
> > Acked-by: Stanislav Fomichev <sdf@fomichev.me>
> 
> Thanks for acking! However for some reason clashiko missed this set, can
> someone remind me what could be the case here?
> 
> I also see in SUIE that check_selftest failed - is it mandatory to repost
> in this case?

```
Bad format: tools/testing/selftests/net/Makefile
```

Not super descriptive :-(

Maybe check on your side if this is complaining about something legit?

https://github.com/linux-netdev/nipa/blob/main/tests/patch/check_selftest/validate_makefile_format.py

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH net-next 0/4] selftests: move the AF_XDP test suite from bpf to net
  2026-11-09 16:52     ` Stanislav Fomichev
@ 2026-11-09 19:12       ` Maciej Fijalkowski
  0 siblings, 0 replies; 9+ messages in thread
From: Maciej Fijalkowski @ 2026-11-09 19:12 UTC (permalink / raw)
  To: Stanislav Fomichev
  Cc: netdev, magnus.karlsson, stfomichev, kuba, pabeni,
	tushar.vyavahare, kerneljasonxing, bjorn

On Mon, Nov 09, 2026 at 08:52:20AM -0800, Stanislav Fomichev wrote:
> On 11/09, Maciej Fijalkowski wrote:
> > On Thu, Nov 05, 2026 at 12:43:36PM -0800, Stanislav Fomichev wrote:
> > > On 11/05, Maciej Fijalkowski wrote:
> > > > Hi,
> > > > 
> > > > As the maintainers asked, this series is the first step of moving the
> > > > AF_XDP selftests from selftests/bpf to selftests/net: the code moves and
> > > > builds from its new location, without changing what the tests do. The
> > > > rework [0] posted as "selftests: net: migrate AF_XDP test suite over to
> > > > net" (v4) will follow on top of this move.
> > > > 
> > > > Patch 1 drops the test_progs wrapper of the AF_XDP tests, patch 2 adds a
> > > > generic BPF skeleton rule to net/bpf.mk, patch 3 moves xskxceiver, its
> > > > library and test_xsk.sh to selftests/net, and patch 4 (new, not covered
> > > > at [0]) moves xdp_hw_metadata, which is built from the same library.
> > > > 
> > > > The xdp_metadata test stays in test_progs: it covers BPF core
> > > > behaviour, and moving it would mean rewriting it for the kselftest
> > > > harness. It keeps using xsk.c from net/lib/xsk.
> > > > 
> > > > xskxceiver and xdp_hw_metadata are the first users of bpftool at build
> > > > time in selftests/net. NIPA has bpftool, but 0-day and KernelCI build
> > > > net without it, so both tools are skipped with a warning when bpftool
> > > > is missing or does not run.
> > > > 
> > > > test_xsk.sh is installed but not run by run_tests, so NIPA does not pick
> > > > it up: it runs every case, including flaky ones, and some cases leak
> > > > page_pool pages after skb_pp_cow_data() in generic XDP mode on
> > > > veth-based runs. Until a later step makes the suite fit for NIPA, no CI
> > > > runs the AF_XDP tests. test_xsk.sh is being removed by [0] but it is
> > > > kept here as there is no other feasible way to run the test suite (if
> > > > needed) until we come up with an upstreamable Python runner.
> > > > 
> > > > Thanks,
> > > > Maciej
> > > > 
> > > > [0]: https://lore.kernel.org/bpf/20261016174338.787135-1-maciej.fijalkowski@intel.com/
> > > > 
> > > > Maciej Fijalkowski (4):
> > > >   selftests/bpf: drop the test_progs AF_XDP wrapper
> > > >   selftests: net: add a generic rule for BPF skeletons
> > > >   selftests: xsk: move the AF_XDP test suite to selftests/net
> > > >   selftests: net: move xdp_hw_metadata from selftests/bpf
> > > 
> > > Acked-by: Stanislav Fomichev <sdf@fomichev.me>
> > 
> > Thanks for acking! However for some reason clashiko missed this set, can
> > someone remind me what could be the case here?
> > 
> > I also see in SUIE that check_selftest failed - is it mandatory to repost
> > in this case?
> 
> ```
> Bad format: tools/testing/selftests/net/Makefile
> ```
> 
> Not super descriptive :-(
> 
> Maybe check on your side if this is complaining about something legit?
> 
> https://github.com/linux-netdev/nipa/blob/main/tests/patch/check_selftest/validate_makefile_format.py

It is upset about redefining TEST_GEN_FILES on patch 4. Will send a v2
that fixes it.


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2026-11-09 19:16 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-11-05 13:41 [PATCH net-next 0/4] selftests: move the AF_XDP test suite from bpf to net Maciej Fijalkowski
2026-11-05 13:41 ` [PATCH net-next 1/4] selftests/bpf: drop the test_progs AF_XDP wrapper Maciej Fijalkowski
2026-11-05 13:41 ` [PATCH net-next 2/4] selftests: net: add a generic rule for BPF skeletons Maciej Fijalkowski
2026-11-05 13:41 ` [PATCH net-next 3/4] selftests: xsk: move the AF_XDP test suite to selftests/net Maciej Fijalkowski
2026-11-05 13:41 ` [PATCH net-next 4/4] selftests: net: move xdp_hw_metadata from selftests/bpf Maciej Fijalkowski
2026-11-05 20:43 ` [PATCH net-next 0/4] selftests: move the AF_XDP test suite from bpf to net Stanislav Fomichev
2026-11-09 12:44   ` Maciej Fijalkowski
2026-11-09 16:52     ` Stanislav Fomichev
2026-11-09 19:12       ` Maciej Fijalkowski

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox