From nobody Fri Oct 3 07:42:27 2025 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 85CF3307AD3; Thu, 4 Sep 2025 10:11:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756980718; cv=none; b=ggQDBHC9FK0FPTKnS6j1DM7b0wq63xrS36F+MbMrrXQ5i4ZNruXJQNiiLrLJGvEzhFYYKzeICxs2FAak+FyL6VbfuHla5Q8S+1uc5j7MJt51glMWVbXSMvSEGfr3iKnuttZ4UyYd1aggloIAGdDcXgf/XLTH1SVTvYjhzI92XEY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756980718; c=relaxed/simple; bh=PMt2uO6UeQRaR3haWcdZa7nGacOF6eHp/N7/6UpD1GE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=D4oNum686ElgyW3T7dWTfu4dQ999p+XZibj1FZKhcfB40h2UK+J0vOL7GLWmLUJGbwQn25dOpFmU0+M84iG9opnWKHFbZuYiiQI3FCvJhhS7B7JwNZWEbQSYEiT7mT+/IUDg+LEef54Aivv7VS2CKbn6V7YLFrbg9QkjTYVjkww= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=E0hR3N4A; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="E0hR3N4A" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 516341A0D64; Thu, 4 Sep 2025 10:11:55 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 2A27C606BB; Thu, 4 Sep 2025 10:11:55 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 2DC401C22D9F6; Thu, 4 Sep 2025 12:11:51 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1756980713; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=/UBLfqCcIISrW8jCas/f1ZnRrmJywX30arPGEkmFDDQ=; b=E0hR3N4AEa8+LZlTcd2/YGCHeEN74ogeW0ONCbM7jItnZHdPKwSuUyXsL4ZPy1M5hssf/m PNfrm5EXXnWVKqdpGcCZXDWqg5yzf/bR33ah7DBEF2I2MOsQrBOIuDtROc54counfZdLel Og/9nPQVU7aNMK/mklqM1XJT9RYYsld6wrYAuC3Gq5oooh8Ejyhj9ZK0CbfjZpQHY2oaML tFFDid0V/RZQmOFBC4fYiVkwa2bh8NgGXtR6tMzqqwW2jKjTi/+z2ytrc1X7QLP3KsJyHv HDI0UrjN0ij7Sf9vCoEjfF2VaO15hDpYCfJGehegsj2Nft60sM9Emyfjh90C+g== From: "Bastien Curutchet (eBPF Foundation)" Date: Thu, 04 Sep 2025 12:10:29 +0200 Subject: [PATCH bpf-next v3 14/14] selftests/bpf: test_xsk: Integrate test_xsk.c to test_progs framework Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250904-xsk-v3-14-ce382e331485@bootlin.com> References: <20250904-xsk-v3-0-ce382e331485@bootlin.com> In-Reply-To: <20250904-xsk-v3-0-ce382e331485@bootlin.com> To: =?utf-8?q?Bj=C3=B6rn_T=C3=B6pel?= , Magnus Karlsson , Maciej Fijalkowski , Jonathan Lemon , Alexei Starovoitov , Daniel Borkmann , Andrii Nakryiko , Martin KaFai Lau , Eduard Zingerman , Song Liu , Yonghong Song , John Fastabend , KP Singh , Stanislav Fomichev , Hao Luo , Jiri Olsa , Mykola Lysenko , Shuah Khan , "David S. Miller" , Jakub Kicinski , Jesper Dangaard Brouer Cc: Thomas Petazzoni , Alexis Lothore , netdev@vger.kernel.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, "Bastien Curutchet (eBPF Foundation)" X-Mailer: b4 0.14.2 X-Last-TLS-Session-Version: TLSv1.3 test_xsk.c isn't part of the test_progs framework. Integrate the tests defined by test_xsk.c into the test_progs framework through a new file : prog_tests/xsk.c. ZeroCopy mode isn't tested in it as veth peers don't support it. Move test_xsk{.c/.h} to prog_tests/. Add the find_bit library to test_progs sources in the Makefile as it is is used by test_xsk.c Signed-off-by: Bastien Curutchet (eBPF Foundation) --- tools/testing/selftests/bpf/Makefile | 13 +- .../selftests/bpf/{ =3D> prog_tests}/test_xsk.c | 0 .../selftests/bpf/{ =3D> prog_tests}/test_xsk.h | 0 tools/testing/selftests/bpf/prog_tests/xsk.c | 146 +++++++++++++++++= ++++ tools/testing/selftests/bpf/xskxceiver.c | 2 +- 5 files changed, 158 insertions(+), 3 deletions(-) diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests= /bpf/Makefile index 4bb4f3ee822c1adce0fbd82725b40983695d38b9..1af7d4b9fe54b777131bce0cbb8= ca328c885c23a 100644 --- a/tools/testing/selftests/bpf/Makefile +++ b/tools/testing/selftests/bpf/Makefile @@ -541,6 +541,8 @@ TRUNNER_TEST_OBJS :=3D $$(patsubst %.c,$$(TRUNNER_OUTPU= T)/%.test.o, \ $$(notdir $$(wildcard $(TRUNNER_TESTS_DIR)/*.c))) TRUNNER_EXTRA_OBJS :=3D $$(patsubst %.c,$$(TRUNNER_OUTPUT)/%.o, \ $$(filter %.c,$(TRUNNER_EXTRA_SOURCES))) +TRUNNER_LIB_OBJS :=3D $$(patsubst %.c,$$(TRUNNER_OUTPUT)/%.o, \ + $$(filter %.c,$(TRUNNER_LIB_SOURCES))) TRUNNER_EXTRA_HDRS :=3D $$(filter %.h,$(TRUNNER_EXTRA_SOURCES)) TRUNNER_TESTS_HDR :=3D $(TRUNNER_TESTS_DIR)/tests.h TRUNNER_BPF_SRCS :=3D $$(notdir $$(wildcard $(TRUNNER_BPF_PROGS_DIR)/*.c)) @@ -672,6 +674,10 @@ $(TRUNNER_EXTRA_OBJS): $(TRUNNER_OUTPUT)/%.o: \ $$(call msg,EXT-OBJ,$(TRUNNER_BINARY),$$@) $(Q)$$(CC) $$(CFLAGS) -c $$< $$(LDLIBS) -o $$@ =20 +$(TRUNNER_LIB_OBJS): $(TRUNNER_OUTPUT)/%.o:$(TOOLSDIR)/lib/%.c + $$(call msg,LIB-OBJ,$(TRUNNER_BINARY),$$@) + $(Q)$$(CC) $$(CFLAGS) -c $$< $$(LDLIBS) -o $$@ + # non-flavored in-srctree builds receive special treatment, in particular,= we # do not need to copy extra resources (see e.g. test_btf_dump_case()) $(TRUNNER_BINARY)-extras: $(TRUNNER_EXTRA_FILES) | $(TRUNNER_OUTPUT) @@ -685,6 +691,7 @@ $(OUTPUT)/$(TRUNNER_BINARY): | $(TRUNNER_BPF_OBJS) =20 $(OUTPUT)/$(TRUNNER_BINARY): $(TRUNNER_TEST_OBJS) \ $(TRUNNER_EXTRA_OBJS) $$(BPFOBJ) \ + $(TRUNNER_LIB_OBJS) \ $(RESOLVE_BTFIDS) \ $(TRUNNER_BPFTOOL) \ $(OUTPUT)/veristat \ @@ -718,6 +725,7 @@ TRUNNER_EXTRA_SOURCES :=3D test_progs.c \ json_writer.c \ flow_dissector_load.h \ ip_check_defrag_frags.h +TRUNNER_LIB_SOURCES :=3D find_bit.c TRUNNER_EXTRA_FILES :=3D $(OUTPUT)/urandom_read \ $(OUTPUT)/liburandom_read.so \ $(OUTPUT)/xdp_synproxy \ @@ -755,6 +763,7 @@ endif TRUNNER_TESTS_DIR :=3D map_tests TRUNNER_BPF_PROGS_DIR :=3D progs TRUNNER_EXTRA_SOURCES :=3D test_maps.c +TRUNNER_LIB_SOURCES :=3D TRUNNER_EXTRA_FILES :=3D TRUNNER_BPF_BUILD_RULE :=3D $$(error no BPF objects should be built) TRUNNER_BPF_CFLAGS :=3D @@ -776,8 +785,8 @@ $(OUTPUT)/test_verifier: test_verifier.c verifier/tests= .h $(BPFOBJ) | $(OUTPUT) $(Q)$(CC) $(CFLAGS) $(filter %.a %.o %.c,$^) $(LDLIBS) -o $@ =20 # Include find_bit.c to compile xskxceiver. -EXTRA_SRC :=3D $(TOOLSDIR)/lib/find_bit.c -$(OUTPUT)/xskxceiver: $(EXTRA_SRC) test_xsk.c test_xsk.h xskxceiver.c xskx= ceiver.h $(OUTPUT)/network_helpers.o $(OUTPUT)/xsk.o $(OUTPUT)/xsk_xdp_prog= s.skel.h $(BPFOBJ) | $(OUTPUT) +EXTRA_SRC :=3D $(TOOLSDIR)/lib/find_bit.c prog_tests/test_xsk.c prog_tests= /test_xsk.h +$(OUTPUT)/xskxceiver: $(EXTRA_SRC) xskxceiver.c xskxceiver.h $(OUTPUT)/net= work_helpers.o $(OUTPUT)/xsk.o $(OUTPUT)/xsk_xdp_progs.skel.h $(BPFOBJ) | $= (OUTPUT) $(call msg,BINARY,,$@) $(Q)$(CC) $(CFLAGS) $(filter %.a %.o %.c,$^) $(LDLIBS) -o $@ =20 diff --git a/tools/testing/selftests/bpf/test_xsk.c b/tools/testing/selftes= ts/bpf/prog_tests/test_xsk.c similarity index 100% rename from tools/testing/selftests/bpf/test_xsk.c rename to tools/testing/selftests/bpf/prog_tests/test_xsk.c diff --git a/tools/testing/selftests/bpf/test_xsk.h b/tools/testing/selftes= ts/bpf/prog_tests/test_xsk.h similarity index 100% rename from tools/testing/selftests/bpf/test_xsk.h rename to tools/testing/selftests/bpf/prog_tests/test_xsk.h diff --git a/tools/testing/selftests/bpf/prog_tests/xsk.c b/tools/testing/s= elftests/bpf/prog_tests/xsk.c new file mode 100644 index 0000000000000000000000000000000000000000..7ce5ddd7d3fc848df27534f00a6= a9f82fbc797c5 --- /dev/null +++ b/tools/testing/selftests/bpf/prog_tests/xsk.c @@ -0,0 +1,146 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include + +#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 numtxq= ueues 4 numrxqueues 4", + VETH_RX, VETH_TX); + SYS(fail, "sysctl -wq net.ipv6.conf.%s.disable_ipv6=3D1", VETH_RX); + SYS(fail, "sysctl -wq net.ipv6.conf.%s.disable_ipv6=3D1", 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 =3D if_nametoindex(VETH_RX); + if (!ASSERT_OK_FD(rx->ifindex, "get RX ifindex")) + return -1; + + tx->ifindex =3D if_nametoindex(VETH_TX); + if (!ASSERT_OK_FD(tx->ifindex, "get TX ifindex")) + return -1; + + tx->shared_umem =3D false; + rx->shared_umem =3D false; + + + return 0; +} + +static void test_xsk(const struct test_spec *test_to_run, enum test_mode m= ode) +{ + struct ifobject *ifobj_tx, *ifobj_rx; + struct test_spec test; + int ret; + + ifobj_tx =3D ifobject_create(); + if (!ASSERT_OK_PTR(ifobj_tx, "create ifobj_tx")) + return; + + ifobj_rx =3D ifobject_create(); + if (!ASSERT_OK_PTR(ifobj_rx, "create ifobj_rx")) + goto delete_tx; + + if (!ASSERT_OK(setup_veth(false), "setup veth")) + goto delete_rx; + + if (!ASSERT_OK(configure_ifobj(ifobj_tx, ifobj_rx), "conigure ifobj")) + goto delete_veth; + + ret =3D get_hw_ring_size(ifobj_tx->ifname, &ifobj_tx->ring); + if (!ret) { + ifobj_tx->hw_ring_size_supp =3D true; + ifobj_tx->set_ring.default_tx =3D ifobj_tx->ring.tx_pending; + ifobj_tx->set_ring.default_rx =3D ifobj_tx->ring.rx_pending; + } + + if (!ASSERT_OK(init_iface(ifobj_rx, worker_testapp_validate_rx), "init RX= ")) + goto delete_veth; + if (!ASSERT_OK(init_iface(ifobj_tx, worker_testapp_validate_tx), "init TX= ")) + goto delete_veth; + + test_init(&test, ifobj_tx, ifobj_rx, 0, &tests[0]); + + test.tx_pkt_stream_default =3D pkt_stream_generate(DEFAULT_PKT_CNT, MIN_P= KT_SIZE); + if (!ASSERT_OK_PTR(test.tx_pkt_stream_default, "TX pkt generation")) + goto delete_veth; + test.rx_pkt_stream_default =3D pkt_stream_generate(DEFAULT_PKT_CNT, MIN_P= KT_SIZE); + if (!ASSERT_OK_PTR(test.rx_pkt_stream_default, "RX pkt generation")) + goto delete_veth; + + + test_init(&test, ifobj_tx, ifobj_rx, mode, test_to_run); + ret =3D test.test_func(&test); + if (ret !=3D 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_veth: + delete_veth(); +delete_rx: + ifobject_delete(ifobj_rx); +delete_tx: + ifobject_delete(ifobj_tx); +} + +void test_ns_xsk_skb(void) +{ + int i; + + for (i =3D 0; i < ARRAY_SIZE(tests); i++) { + if (test__start_subtest(tests[i].name)) + test_xsk(&tests[i], TEST_MODE_SKB); + } +} + +void test_ns_xsk_drv(void) +{ + int i; + + for (i =3D 0; i < ARRAY_SIZE(tests); i++) { + if (test__start_subtest(tests[i].name)) + test_xsk(&tests[i], TEST_MODE_DRV); + } +} + diff --git a/tools/testing/selftests/bpf/xskxceiver.c b/tools/testing/selft= ests/bpf/xskxceiver.c index 0d8e240864c747253d72319efeecd46f0fdeff03..4c8b931d9e3d5b5723df8792255= 1d1b5b97293b1 100644 --- a/tools/testing/selftests/bpf/xskxceiver.c +++ b/tools/testing/selftests/bpf/xskxceiver.c @@ -90,7 +90,7 @@ #include #include =20 -#include "test_xsk.h" +#include "prog_tests/test_xsk.h" #include "xsk_xdp_progs.skel.h" #include "xsk.h" #include "xskxceiver.h" --=20 2.50.1