public inbox for stable@vger.kernel.org
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: stable@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	patches@lists.linux.dev,
	Maciej Fijalkowski <maciej.fijalkowski@intel.com>,
	"Bastien Curutchet (eBPF Foundation)"
	<bastien.curutchet@bootlin.com>,
	Alexei Starovoitov <ast@kernel.org>,
	Sasha Levin <sashal@kernel.org>
Subject: [PATCH 6.18 123/641] selftests/bpf: test_xsk: Split xskxceiver
Date: Tue, 24 Feb 2026 17:17:29 -0800	[thread overview]
Message-ID: <20260225012352.122240034@linuxfoundation.org> (raw)
In-Reply-To: <20260225012348.915798704@linuxfoundation.org>

6.18-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Bastien Curutchet (eBPF Foundation) <bastien.curutchet@bootlin.com>

[ Upstream commit 3ab77f35a75eb236956c1e8ba8494ef18a75eae0 ]

AF_XDP features are tested by the test_xsk.sh script but not by the
test_progs framework. The tests used by the script are defined in
xksxceiver.c which can't be integrated in the test_progs framework as is.

Extract these test definitions from xskxceiver{.c/.h} to put them in new
test_xsk{.c/.h} files.
Keep the main() function and its unshared dependencies in xksxceiver to
avoid impacting the test_xsk.sh script which is often used to test real
hardware.
Move ksft_test_result_*() calls to xskxceiver.c to keep the kselftest's
report valid

Reviewed-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
Signed-off-by: Bastien Curutchet (eBPF Foundation) <bastien.curutchet@bootlin.com>
Link: https://lore.kernel.org/r/20251031-xsk-v7-1-39fe486593a3@bootlin.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Stable-dep-of: 42e41b2a0afa ("selftests/xsk: properly handle batch ending in the middle of a packet")
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 tools/testing/selftests/bpf/Makefile     |    2 +-
 tools/testing/selftests/bpf/test_xsk.c   | 2420 ++++++++++++++++++++
 tools/testing/selftests/bpf/test_xsk.h   |  297 +++
 tools/testing/selftests/bpf/xskxceiver.c | 2545 +---------------------
 tools/testing/selftests/bpf/xskxceiver.h |  156 --
 5 files changed, 2762 insertions(+), 2658 deletions(-)
 create mode 100644 tools/testing/selftests/bpf/test_xsk.c
 create mode 100644 tools/testing/selftests/bpf/test_xsk.h

diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile
index e59b2bbf8d920..591e7e77f89ba 100644
--- a/tools/testing/selftests/bpf/Makefile
+++ b/tools/testing/selftests/bpf/Makefile
@@ -805,7 +805,7 @@ $(OUTPUT)/test_verifier: test_verifier.c verifier/tests.h $(BPFOBJ) | $(OUTPUT)
 
 # Include find_bit.c to compile xskxceiver.
 EXTRA_SRC := $(TOOLSDIR)/lib/find_bit.c
-$(OUTPUT)/xskxceiver: $(EXTRA_SRC) xskxceiver.c xskxceiver.h $(OUTPUT)/network_helpers.o $(OUTPUT)/xsk.o $(OUTPUT)/xsk_xdp_progs.skel.h $(BPFOBJ) | $(OUTPUT)
+$(OUTPUT)/xskxceiver: $(EXTRA_SRC) test_xsk.c test_xsk.h xskxceiver.c xskxceiver.h $(OUTPUT)/network_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 $@
 
diff --git a/tools/testing/selftests/bpf/test_xsk.c b/tools/testing/selftests/bpf/test_xsk.c
new file mode 100644
index 0000000000000..02250f29f9946
--- /dev/null
+++ b/tools/testing/selftests/bpf/test_xsk.c
@@ -0,0 +1,2420 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <bpf/bpf.h>
+#include <errno.h>
+#include <linux/bitmap.h>
+#include <linux/if_link.h>
+#include <linux/mman.h>
+#include <linux/netdev.h>
+#include <poll.h>
+#include <pthread.h>
+#include <signal.h>
+#include <string.h>
+#include <sys/mman.h>
+#include <sys/socket.h>
+#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"
+
+#define DEFAULT_BATCH_SIZE		64
+#define MIN_PKT_SIZE			64
+#define MAX_ETH_JUMBO_SIZE		9000
+#define MAX_INTERFACES			2
+#define MAX_TEARDOWN_ITER		10
+#define MAX_TX_BUDGET_DEFAULT		32
+#define PKT_DUMP_NB_TO_PRINT		16
+/* Just to align the data in the packet */
+#define PKT_HDR_SIZE			(sizeof(struct ethhdr) + 2)
+#define POLL_TMOUT			1000
+#define THREAD_TMOUT			3
+#define UMEM_HEADROOM_TEST_SIZE		128
+#define XSK_DESC__INVALID_OPTION	(0xffff)
+#define XSK_UMEM__INVALID_FRAME_SIZE	(MAX_ETH_JUMBO_SIZE + 1)
+#define XSK_UMEM__LARGE_FRAME_SIZE	(3 * 1024)
+#define XSK_UMEM__MAX_FRAME_SIZE	(4 * 1024)
+
+static const u8 g_mac[ETH_ALEN] = {0x55, 0x44, 0x33, 0x22, 0x11, 0x00};
+
+bool opt_verbose;
+pthread_barrier_t barr;
+pthread_mutex_t pacing_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+int pkts_in_flight;
+
+/* The payload is a word consisting of a packet sequence number in the upper
+ * 16-bits and a intra packet data sequence number in the lower 16 bits. So the 3rd packet's
+ * 5th word of data will contain the number (2<<16) | 4 as they are numbered from 0.
+ */
+static void write_payload(void *dest, u32 pkt_nb, u32 start, u32 size)
+{
+	u32 *ptr = (u32 *)dest, i;
+
+	start /= sizeof(*ptr);
+	size /= sizeof(*ptr);
+	for (i = 0; i < size; i++)
+		ptr[i] = htonl(pkt_nb << 16 | (i + start));
+}
+
+static void gen_eth_hdr(struct xsk_socket_info *xsk, struct ethhdr *eth_hdr)
+{
+	memcpy(eth_hdr->h_dest, xsk->dst_mac, ETH_ALEN);
+	memcpy(eth_hdr->h_source, xsk->src_mac, ETH_ALEN);
+	eth_hdr->h_proto = htons(ETH_P_LOOPBACK);
+}
+
+static bool is_umem_valid(struct ifobject *ifobj)
+{
+	return !!ifobj->umem->umem;
+}
+
+static u32 mode_to_xdp_flags(enum test_mode mode)
+{
+	return (mode == TEST_MODE_SKB) ? XDP_FLAGS_SKB_MODE : XDP_FLAGS_DRV_MODE;
+}
+
+static u64 umem_size(struct xsk_umem_info *umem)
+{
+	return umem->num_frames * umem->frame_size;
+}
+
+int xsk_configure_umem(struct ifobject *ifobj, struct xsk_umem_info *umem, void *buffer,
+			      u64 size)
+{
+	struct xsk_umem_config cfg = {
+		.fill_size = XSK_RING_PROD__DEFAULT_NUM_DESCS,
+		.comp_size = XSK_RING_CONS__DEFAULT_NUM_DESCS,
+		.frame_size = umem->frame_size,
+		.frame_headroom = umem->frame_headroom,
+		.flags = XSK_UMEM__DEFAULT_FLAGS
+	};
+	int ret;
+
+	if (umem->fill_size)
+		cfg.fill_size = umem->fill_size;
+
+	if (umem->comp_size)
+		cfg.comp_size = umem->comp_size;
+
+	if (umem->unaligned_mode)
+		cfg.flags |= XDP_UMEM_UNALIGNED_CHUNK_FLAG;
+
+	ret = xsk_umem__create(&umem->umem, buffer, size,
+			       &umem->fq, &umem->cq, &cfg);
+	if (ret)
+		return ret;
+
+	umem->buffer = buffer;
+	if (ifobj->shared_umem && ifobj->rx_on) {
+		umem->base_addr = umem_size(umem);
+		umem->next_buffer = umem_size(umem);
+	}
+
+	return 0;
+}
+
+static u64 umem_alloc_buffer(struct xsk_umem_info *umem)
+{
+	u64 addr;
+
+	addr = umem->next_buffer;
+	umem->next_buffer += umem->frame_size;
+	if (umem->next_buffer >= umem->base_addr + umem_size(umem))
+		umem->next_buffer = umem->base_addr;
+
+	return addr;
+}
+
+static void umem_reset_alloc(struct xsk_umem_info *umem)
+{
+	umem->next_buffer = 0;
+}
+
+static void enable_busy_poll(struct xsk_socket_info *xsk)
+{
+	int sock_opt;
+
+	sock_opt = 1;
+	if (setsockopt(xsk_socket__fd(xsk->xsk), SOL_SOCKET, SO_PREFER_BUSY_POLL,
+		       (void *)&sock_opt, sizeof(sock_opt)) < 0)
+		exit_with_error(errno);
+
+	sock_opt = 20;
+	if (setsockopt(xsk_socket__fd(xsk->xsk), SOL_SOCKET, SO_BUSY_POLL,
+		       (void *)&sock_opt, sizeof(sock_opt)) < 0)
+		exit_with_error(errno);
+
+	sock_opt = xsk->batch_size;
+	if (setsockopt(xsk_socket__fd(xsk->xsk), SOL_SOCKET, SO_BUSY_POLL_BUDGET,
+		       (void *)&sock_opt, sizeof(sock_opt)) < 0)
+		exit_with_error(errno);
+}
+
+int xsk_configure_socket(struct xsk_socket_info *xsk, struct xsk_umem_info *umem,
+				  struct ifobject *ifobject, bool shared)
+{
+	struct xsk_socket_config cfg = {};
+	struct xsk_ring_cons *rxr;
+	struct xsk_ring_prod *txr;
+
+	xsk->umem = umem;
+	cfg.rx_size = xsk->rxqsize;
+	cfg.tx_size = XSK_RING_PROD__DEFAULT_NUM_DESCS;
+	cfg.bind_flags = ifobject->bind_flags;
+	if (shared)
+		cfg.bind_flags |= XDP_SHARED_UMEM;
+	if (ifobject->mtu > MAX_ETH_PKT_SIZE)
+		cfg.bind_flags |= XDP_USE_SG;
+	if (umem->comp_size)
+		cfg.tx_size = umem->comp_size;
+	if (umem->fill_size)
+		cfg.rx_size = umem->fill_size;
+
+	txr = ifobject->tx_on ? &xsk->tx : NULL;
+	rxr = ifobject->rx_on ? &xsk->rx : NULL;
+	return xsk_socket__create(&xsk->xsk, ifobject->ifindex, 0, umem->umem, rxr, txr, &cfg);
+}
+
+#define MAX_SKB_FRAGS_PATH "/proc/sys/net/core/max_skb_frags"
+static unsigned int get_max_skb_frags(void)
+{
+	unsigned int max_skb_frags = 0;
+	FILE *file;
+
+	file = fopen(MAX_SKB_FRAGS_PATH, "r");
+	if (!file) {
+		ksft_print_msg("Error opening %s\n", MAX_SKB_FRAGS_PATH);
+		return 0;
+	}
+
+	if (fscanf(file, "%u", &max_skb_frags) != 1)
+		ksft_print_msg("Error reading %s\n", MAX_SKB_FRAGS_PATH);
+
+	fclose(file);
+	return max_skb_frags;
+}
+
+static int set_ring_size(struct ifobject *ifobj)
+{
+	int ret;
+	u32 ctr = 0;
+
+	while (ctr++ < SOCK_RECONF_CTR) {
+		ret = set_hw_ring_size(ifobj->ifname, &ifobj->ring);
+		if (!ret)
+			break;
+
+		/* Retry if it fails */
+		if (ctr >= SOCK_RECONF_CTR || errno != EBUSY)
+			return -errno;
+
+		usleep(USLEEP_MAX);
+	}
+
+	return ret;
+}
+
+int hw_ring_size_reset(struct ifobject *ifobj)
+{
+	ifobj->ring.tx_pending = ifobj->set_ring.default_tx;
+	ifobj->ring.rx_pending = ifobj->set_ring.default_rx;
+	return set_ring_size(ifobj);
+}
+
+static void __test_spec_init(struct test_spec *test, struct ifobject *ifobj_tx,
+			     struct ifobject *ifobj_rx)
+{
+	u32 i, j;
+
+	for (i = 0; i < MAX_INTERFACES; i++) {
+		struct ifobject *ifobj = i ? ifobj_rx : ifobj_tx;
+
+		ifobj->xsk = &ifobj->xsk_arr[0];
+		ifobj->use_poll = false;
+		ifobj->use_fill_ring = true;
+		ifobj->release_rx = true;
+		ifobj->validation_func = NULL;
+		ifobj->use_metadata = false;
+
+		if (i == 0) {
+			ifobj->rx_on = false;
+			ifobj->tx_on = true;
+		} else {
+			ifobj->rx_on = true;
+			ifobj->tx_on = false;
+		}
+
+		memset(ifobj->umem, 0, sizeof(*ifobj->umem));
+		ifobj->umem->num_frames = DEFAULT_UMEM_BUFFERS;
+		ifobj->umem->frame_size = XSK_UMEM__DEFAULT_FRAME_SIZE;
+
+		for (j = 0; j < MAX_SOCKETS; j++) {
+			memset(&ifobj->xsk_arr[j], 0, sizeof(ifobj->xsk_arr[j]));
+			ifobj->xsk_arr[j].rxqsize = XSK_RING_CONS__DEFAULT_NUM_DESCS;
+			ifobj->xsk_arr[j].batch_size = DEFAULT_BATCH_SIZE;
+			if (i == 0)
+				ifobj->xsk_arr[j].pkt_stream = test->tx_pkt_stream_default;
+			else
+				ifobj->xsk_arr[j].pkt_stream = test->rx_pkt_stream_default;
+
+			memcpy(ifobj->xsk_arr[j].src_mac, g_mac, ETH_ALEN);
+			memcpy(ifobj->xsk_arr[j].dst_mac, g_mac, ETH_ALEN);
+			ifobj->xsk_arr[j].src_mac[5] += ((j * 2) + 0);
+			ifobj->xsk_arr[j].dst_mac[5] += ((j * 2) + 1);
+		}
+	}
+
+	if (ifobj_tx->hw_ring_size_supp)
+		hw_ring_size_reset(ifobj_tx);
+
+	test->ifobj_tx = ifobj_tx;
+	test->ifobj_rx = ifobj_rx;
+	test->current_step = 0;
+	test->total_steps = 1;
+	test->nb_sockets = 1;
+	test->fail = false;
+	test->set_ring = false;
+	test->adjust_tail = false;
+	test->adjust_tail_support = false;
+	test->mtu = MAX_ETH_PKT_SIZE;
+	test->xdp_prog_rx = ifobj_rx->xdp_progs->progs.xsk_def_prog;
+	test->xskmap_rx = ifobj_rx->xdp_progs->maps.xsk;
+	test->xdp_prog_tx = ifobj_tx->xdp_progs->progs.xsk_def_prog;
+	test->xskmap_tx = ifobj_tx->xdp_progs->maps.xsk;
+}
+
+void test_init(struct test_spec *test, struct ifobject *ifobj_tx,
+			   struct ifobject *ifobj_rx, enum test_mode mode,
+			   const struct test_spec *test_to_run)
+{
+	struct pkt_stream *tx_pkt_stream;
+	struct pkt_stream *rx_pkt_stream;
+	u32 i;
+
+	tx_pkt_stream = test->tx_pkt_stream_default;
+	rx_pkt_stream = test->rx_pkt_stream_default;
+	memset(test, 0, sizeof(*test));
+	test->tx_pkt_stream_default = tx_pkt_stream;
+	test->rx_pkt_stream_default = rx_pkt_stream;
+
+	for (i = 0; i < MAX_INTERFACES; i++) {
+		struct ifobject *ifobj = i ? ifobj_rx : ifobj_tx;
+
+		ifobj->bind_flags = XDP_USE_NEED_WAKEUP;
+		if (mode == TEST_MODE_ZC)
+			ifobj->bind_flags |= XDP_ZEROCOPY;
+		else
+			ifobj->bind_flags |= XDP_COPY;
+	}
+
+	memcpy(test->name, test_to_run->name, MAX_TEST_NAME_SIZE);
+	test->test_func = test_to_run->test_func;
+	test->mode = mode;
+	__test_spec_init(test, ifobj_tx, ifobj_rx);
+}
+
+static void test_spec_reset(struct test_spec *test)
+{
+	__test_spec_init(test, test->ifobj_tx, test->ifobj_rx);
+}
+
+static void test_spec_set_xdp_prog(struct test_spec *test, struct bpf_program *xdp_prog_rx,
+				   struct bpf_program *xdp_prog_tx, struct bpf_map *xskmap_rx,
+				   struct bpf_map *xskmap_tx)
+{
+	test->xdp_prog_rx = xdp_prog_rx;
+	test->xdp_prog_tx = xdp_prog_tx;
+	test->xskmap_rx = xskmap_rx;
+	test->xskmap_tx = xskmap_tx;
+}
+
+static int test_spec_set_mtu(struct test_spec *test, int mtu)
+{
+	int err;
+
+	if (test->ifobj_rx->mtu != mtu) {
+		err = xsk_set_mtu(test->ifobj_rx->ifindex, mtu);
+		if (err)
+			return err;
+		test->ifobj_rx->mtu = mtu;
+	}
+	if (test->ifobj_tx->mtu != mtu) {
+		err = xsk_set_mtu(test->ifobj_tx->ifindex, mtu);
+		if (err)
+			return err;
+		test->ifobj_tx->mtu = mtu;
+	}
+
+	return 0;
+}
+
+void pkt_stream_reset(struct pkt_stream *pkt_stream)
+{
+	if (pkt_stream) {
+		pkt_stream->current_pkt_nb = 0;
+		pkt_stream->nb_rx_pkts = 0;
+	}
+}
+
+static struct pkt *pkt_stream_get_next_tx_pkt(struct pkt_stream *pkt_stream)
+{
+	if (pkt_stream->current_pkt_nb >= pkt_stream->nb_pkts)
+		return NULL;
+
+	return &pkt_stream->pkts[pkt_stream->current_pkt_nb++];
+}
+
+static struct pkt *pkt_stream_get_next_rx_pkt(struct pkt_stream *pkt_stream, u32 *pkts_sent)
+{
+	while (pkt_stream->current_pkt_nb < pkt_stream->nb_pkts) {
+		(*pkts_sent)++;
+		if (pkt_stream->pkts[pkt_stream->current_pkt_nb].valid)
+			return &pkt_stream->pkts[pkt_stream->current_pkt_nb++];
+		pkt_stream->current_pkt_nb++;
+	}
+	return NULL;
+}
+
+void pkt_stream_delete(struct pkt_stream *pkt_stream)
+{
+	free(pkt_stream->pkts);
+	free(pkt_stream);
+}
+
+void pkt_stream_restore_default(struct test_spec *test)
+{
+	struct pkt_stream *tx_pkt_stream = test->ifobj_tx->xsk->pkt_stream;
+	struct pkt_stream *rx_pkt_stream = test->ifobj_rx->xsk->pkt_stream;
+
+	if (tx_pkt_stream != test->tx_pkt_stream_default) {
+		pkt_stream_delete(test->ifobj_tx->xsk->pkt_stream);
+		test->ifobj_tx->xsk->pkt_stream = test->tx_pkt_stream_default;
+	}
+
+	if (rx_pkt_stream != test->rx_pkt_stream_default) {
+		pkt_stream_delete(test->ifobj_rx->xsk->pkt_stream);
+		test->ifobj_rx->xsk->pkt_stream = test->rx_pkt_stream_default;
+	}
+}
+
+static struct pkt_stream *__pkt_stream_alloc(u32 nb_pkts)
+{
+	struct pkt_stream *pkt_stream;
+
+	pkt_stream = calloc(1, sizeof(*pkt_stream));
+	if (!pkt_stream)
+		return NULL;
+
+	pkt_stream->pkts = calloc(nb_pkts, sizeof(*pkt_stream->pkts));
+	if (!pkt_stream->pkts) {
+		free(pkt_stream);
+		return NULL;
+	}
+
+	pkt_stream->nb_pkts = nb_pkts;
+	return pkt_stream;
+}
+
+static u32 pkt_nb_frags(u32 frame_size, struct pkt_stream *pkt_stream, struct pkt *pkt)
+{
+	u32 nb_frags = 1, next_frag;
+
+	if (!pkt)
+		return 1;
+
+	if (!pkt_stream->verbatim) {
+		if (!pkt->valid || !pkt->len)
+			return 1;
+		return ceil_u32(pkt->len, frame_size);
+	}
+
+	/* Search for the end of the packet in verbatim mode */
+	if (!pkt_continues(pkt->options))
+		return nb_frags;
+
+	next_frag = pkt_stream->current_pkt_nb;
+	pkt++;
+	while (next_frag++ < pkt_stream->nb_pkts) {
+		nb_frags++;
+		if (!pkt_continues(pkt->options) || !pkt->valid)
+			break;
+		pkt++;
+	}
+	return nb_frags;
+}
+
+static bool set_pkt_valid(int offset, u32 len)
+{
+	return len <= MAX_ETH_JUMBO_SIZE;
+}
+
+static void pkt_set(struct pkt_stream *pkt_stream, struct pkt *pkt, int offset, u32 len)
+{
+	pkt->offset = offset;
+	pkt->len = len;
+	pkt->valid = set_pkt_valid(offset, len);
+}
+
+static void pkt_stream_pkt_set(struct pkt_stream *pkt_stream, struct pkt *pkt, int offset, u32 len)
+{
+	bool prev_pkt_valid = pkt->valid;
+
+	pkt_set(pkt_stream, pkt, offset, len);
+	pkt_stream->nb_valid_entries += pkt->valid - prev_pkt_valid;
+}
+
+static u32 pkt_get_buffer_len(struct xsk_umem_info *umem, u32 len)
+{
+	return ceil_u32(len, umem->frame_size) * umem->frame_size;
+}
+
+static struct pkt_stream *__pkt_stream_generate(u32 nb_pkts, u32 pkt_len, u32 nb_start, u32 nb_off)
+{
+	struct pkt_stream *pkt_stream;
+	u32 i;
+
+	pkt_stream = __pkt_stream_alloc(nb_pkts);
+	if (!pkt_stream)
+		exit_with_error(ENOMEM);
+
+	pkt_stream->nb_pkts = nb_pkts;
+	pkt_stream->max_pkt_len = pkt_len;
+	for (i = 0; i < nb_pkts; i++) {
+		struct pkt *pkt = &pkt_stream->pkts[i];
+
+		pkt_stream_pkt_set(pkt_stream, pkt, 0, pkt_len);
+		pkt->pkt_nb = nb_start + i * nb_off;
+	}
+
+	return pkt_stream;
+}
+
+struct pkt_stream *pkt_stream_generate(u32 nb_pkts, u32 pkt_len)
+{
+	return __pkt_stream_generate(nb_pkts, pkt_len, 0, 1);
+}
+
+static struct pkt_stream *pkt_stream_clone(struct pkt_stream *pkt_stream)
+{
+	return pkt_stream_generate(pkt_stream->nb_pkts, pkt_stream->pkts[0].len);
+}
+
+static void pkt_stream_replace_ifobject(struct ifobject *ifobj, u32 nb_pkts, u32 pkt_len)
+{
+	ifobj->xsk->pkt_stream = pkt_stream_generate(nb_pkts, pkt_len);
+}
+
+static void pkt_stream_replace(struct test_spec *test, u32 nb_pkts, u32 pkt_len)
+{
+	pkt_stream_replace_ifobject(test->ifobj_tx, nb_pkts, pkt_len);
+	pkt_stream_replace_ifobject(test->ifobj_rx, nb_pkts, pkt_len);
+}
+
+static void __pkt_stream_replace_half(struct ifobject *ifobj, u32 pkt_len,
+				      int offset)
+{
+	struct pkt_stream *pkt_stream;
+	u32 i;
+
+	pkt_stream = pkt_stream_clone(ifobj->xsk->pkt_stream);
+	for (i = 1; i < ifobj->xsk->pkt_stream->nb_pkts; i += 2)
+		pkt_stream_pkt_set(pkt_stream, &pkt_stream->pkts[i], offset, pkt_len);
+
+	ifobj->xsk->pkt_stream = pkt_stream;
+}
+
+static void pkt_stream_replace_half(struct test_spec *test, u32 pkt_len, int offset)
+{
+	__pkt_stream_replace_half(test->ifobj_tx, pkt_len, offset);
+	__pkt_stream_replace_half(test->ifobj_rx, pkt_len, offset);
+}
+
+static void pkt_stream_receive_half(struct test_spec *test)
+{
+	struct pkt_stream *pkt_stream = test->ifobj_tx->xsk->pkt_stream;
+	u32 i;
+
+	test->ifobj_rx->xsk->pkt_stream = pkt_stream_generate(pkt_stream->nb_pkts,
+							      pkt_stream->pkts[0].len);
+	pkt_stream = test->ifobj_rx->xsk->pkt_stream;
+	for (i = 1; i < pkt_stream->nb_pkts; i += 2)
+		pkt_stream->pkts[i].valid = false;
+
+	pkt_stream->nb_valid_entries /= 2;
+}
+
+static void pkt_stream_even_odd_sequence(struct test_spec *test)
+{
+	struct pkt_stream *pkt_stream;
+	u32 i;
+
+	for (i = 0; i < test->nb_sockets; i++) {
+		pkt_stream = test->ifobj_tx->xsk_arr[i].pkt_stream;
+		pkt_stream = __pkt_stream_generate(pkt_stream->nb_pkts / 2,
+						   pkt_stream->pkts[0].len, i, 2);
+		test->ifobj_tx->xsk_arr[i].pkt_stream = pkt_stream;
+
+		pkt_stream = test->ifobj_rx->xsk_arr[i].pkt_stream;
+		pkt_stream = __pkt_stream_generate(pkt_stream->nb_pkts / 2,
+						   pkt_stream->pkts[0].len, i, 2);
+		test->ifobj_rx->xsk_arr[i].pkt_stream = pkt_stream;
+	}
+}
+
+static u64 pkt_get_addr(struct pkt *pkt, struct xsk_umem_info *umem)
+{
+	if (!pkt->valid)
+		return pkt->offset;
+	return pkt->offset + umem_alloc_buffer(umem);
+}
+
+static void pkt_stream_cancel(struct pkt_stream *pkt_stream)
+{
+	pkt_stream->current_pkt_nb--;
+}
+
+static void pkt_generate(struct xsk_socket_info *xsk, struct xsk_umem_info *umem, u64 addr, u32 len,
+			 u32 pkt_nb, u32 bytes_written)
+{
+	void *data = xsk_umem__get_data(umem->buffer, addr);
+
+	if (len < MIN_PKT_SIZE)
+		return;
+
+	if (!bytes_written) {
+		gen_eth_hdr(xsk, data);
+
+		len -= PKT_HDR_SIZE;
+		data += PKT_HDR_SIZE;
+	} else {
+		bytes_written -= PKT_HDR_SIZE;
+	}
+
+	write_payload(data, pkt_nb, bytes_written, len);
+}
+
+static struct pkt_stream *__pkt_stream_generate_custom(struct ifobject *ifobj, struct pkt *frames,
+						       u32 nb_frames, bool verbatim)
+{
+	u32 i, len = 0, pkt_nb = 0, payload = 0;
+	struct pkt_stream *pkt_stream;
+
+	pkt_stream = __pkt_stream_alloc(nb_frames);
+	if (!pkt_stream)
+		exit_with_error(ENOMEM);
+
+	for (i = 0; i < nb_frames; i++) {
+		struct pkt *pkt = &pkt_stream->pkts[pkt_nb];
+		struct pkt *frame = &frames[i];
+
+		pkt->offset = frame->offset;
+		if (verbatim) {
+			*pkt = *frame;
+			pkt->pkt_nb = payload;
+			if (!frame->valid || !pkt_continues(frame->options))
+				payload++;
+		} else {
+			if (frame->valid)
+				len += frame->len;
+			if (frame->valid && pkt_continues(frame->options))
+				continue;
+
+			pkt->pkt_nb = pkt_nb;
+			pkt->len = len;
+			pkt->valid = frame->valid;
+			pkt->options = 0;
+
+			len = 0;
+		}
+
+		print_verbose("offset: %d len: %u valid: %u options: %u pkt_nb: %u\n",
+			      pkt->offset, pkt->len, pkt->valid, pkt->options, pkt->pkt_nb);
+
+		if (pkt->valid && pkt->len > pkt_stream->max_pkt_len)
+			pkt_stream->max_pkt_len = pkt->len;
+
+		if (pkt->valid)
+			pkt_stream->nb_valid_entries++;
+
+		pkt_nb++;
+	}
+
+	pkt_stream->nb_pkts = pkt_nb;
+	pkt_stream->verbatim = verbatim;
+	return pkt_stream;
+}
+
+static void pkt_stream_generate_custom(struct test_spec *test, struct pkt *pkts, u32 nb_pkts)
+{
+	struct pkt_stream *pkt_stream;
+
+	pkt_stream = __pkt_stream_generate_custom(test->ifobj_tx, pkts, nb_pkts, true);
+	test->ifobj_tx->xsk->pkt_stream = pkt_stream;
+
+	pkt_stream = __pkt_stream_generate_custom(test->ifobj_rx, pkts, nb_pkts, false);
+	test->ifobj_rx->xsk->pkt_stream = pkt_stream;
+}
+
+static void pkt_print_data(u32 *data, u32 cnt)
+{
+	u32 i;
+
+	for (i = 0; i < cnt; i++) {
+		u32 seqnum, pkt_nb;
+
+		seqnum = ntohl(*data) & 0xffff;
+		pkt_nb = ntohl(*data) >> 16;
+		ksft_print_msg("%u:%u ", pkt_nb, seqnum);
+		data++;
+	}
+}
+
+static void pkt_dump(void *pkt, u32 len, bool eth_header)
+{
+	struct ethhdr *ethhdr = pkt;
+	u32 i, *data;
+
+	if (eth_header) {
+		/*extract L2 frame */
+		ksft_print_msg("DEBUG>> L2: dst mac: ");
+		for (i = 0; i < ETH_ALEN; i++)
+			ksft_print_msg("%02X", ethhdr->h_dest[i]);
+
+		ksft_print_msg("\nDEBUG>> L2: src mac: ");
+		for (i = 0; i < ETH_ALEN; i++)
+			ksft_print_msg("%02X", ethhdr->h_source[i]);
+
+		data = pkt + PKT_HDR_SIZE;
+	} else {
+		data = pkt;
+	}
+
+	/*extract L5 frame */
+	ksft_print_msg("\nDEBUG>> L5: seqnum: ");
+	pkt_print_data(data, PKT_DUMP_NB_TO_PRINT);
+	ksft_print_msg("....");
+	if (len > PKT_DUMP_NB_TO_PRINT * sizeof(u32)) {
+		ksft_print_msg("\n.... ");
+		pkt_print_data(data + len / sizeof(u32) - PKT_DUMP_NB_TO_PRINT,
+			       PKT_DUMP_NB_TO_PRINT);
+	}
+	ksft_print_msg("\n---------------------------------------\n");
+}
+
+static bool is_offset_correct(struct xsk_umem_info *umem, struct pkt *pkt, u64 addr)
+{
+	u32 headroom = umem->unaligned_mode ? 0 : umem->frame_headroom;
+	u32 offset = addr % umem->frame_size, expected_offset;
+	int pkt_offset = pkt->valid ? pkt->offset : 0;
+
+	if (!umem->unaligned_mode)
+		pkt_offset = 0;
+
+	expected_offset = (pkt_offset + headroom + XDP_PACKET_HEADROOM) % umem->frame_size;
+
+	if (offset == expected_offset)
+		return true;
+
+	ksft_print_msg("[%s] expected [%u], got [%u]\n", __func__, expected_offset, offset);
+	return false;
+}
+
+static bool is_metadata_correct(struct pkt *pkt, void *buffer, u64 addr)
+{
+	void *data = xsk_umem__get_data(buffer, addr);
+	struct xdp_info *meta = data - sizeof(struct xdp_info);
+
+	if (meta->count != pkt->pkt_nb) {
+		ksft_print_msg("[%s] expected meta_count [%d], got meta_count [%llu]\n",
+			       __func__, pkt->pkt_nb,
+			       (unsigned long long)meta->count);
+		return false;
+	}
+
+	return true;
+}
+
+static bool is_adjust_tail_supported(struct xsk_xdp_progs *skel_rx)
+{
+	struct bpf_map *data_map;
+	int adjust_value = 0;
+	int key = 0;
+	int ret;
+
+	data_map = bpf_object__find_map_by_name(skel_rx->obj, "xsk_xdp_.bss");
+	if (!data_map || !bpf_map__is_internal(data_map)) {
+		ksft_print_msg("Error: could not find bss section of XDP program\n");
+		exit_with_error(errno);
+	}
+
+	ret = bpf_map_lookup_elem(bpf_map__fd(data_map), &key, &adjust_value);
+	if (ret) {
+		ksft_print_msg("Error: bpf_map_lookup_elem failed with error %d\n", ret);
+		exit_with_error(errno);
+	}
+
+	/* Set the 'adjust_value' variable to -EOPNOTSUPP in the XDP program if the adjust_tail
+	 * helper is not supported. Skip the adjust_tail test case in this scenario.
+	 */
+	return adjust_value != -EOPNOTSUPP;
+}
+
+static bool is_frag_valid(struct xsk_umem_info *umem, u64 addr, u32 len, u32 expected_pkt_nb,
+			  u32 bytes_processed)
+{
+	u32 seqnum, pkt_nb, *pkt_data, words_to_end, expected_seqnum;
+	void *data = xsk_umem__get_data(umem->buffer, addr);
+
+	addr -= umem->base_addr;
+
+	if (addr >= umem->num_frames * umem->frame_size ||
+	    addr + len > umem->num_frames * umem->frame_size) {
+		ksft_print_msg("Frag invalid addr: %llx len: %u\n",
+			       (unsigned long long)addr, len);
+		return false;
+	}
+	if (!umem->unaligned_mode && addr % umem->frame_size + len > umem->frame_size) {
+		ksft_print_msg("Frag crosses frame boundary addr: %llx len: %u\n",
+			       (unsigned long long)addr, len);
+		return false;
+	}
+
+	pkt_data = data;
+	if (!bytes_processed) {
+		pkt_data += PKT_HDR_SIZE / sizeof(*pkt_data);
+		len -= PKT_HDR_SIZE;
+	} else {
+		bytes_processed -= PKT_HDR_SIZE;
+	}
+
+	expected_seqnum = bytes_processed / sizeof(*pkt_data);
+	seqnum = ntohl(*pkt_data) & 0xffff;
+	pkt_nb = ntohl(*pkt_data) >> 16;
+
+	if (expected_pkt_nb != pkt_nb) {
+		ksft_print_msg("[%s] expected pkt_nb [%u], got pkt_nb [%u]\n",
+			       __func__, expected_pkt_nb, pkt_nb);
+		goto error;
+	}
+	if (expected_seqnum != seqnum) {
+		ksft_print_msg("[%s] expected seqnum at start [%u], got seqnum [%u]\n",
+			       __func__, expected_seqnum, seqnum);
+		goto error;
+	}
+
+	words_to_end = len / sizeof(*pkt_data) - 1;
+	pkt_data += words_to_end;
+	seqnum = ntohl(*pkt_data) & 0xffff;
+	expected_seqnum += words_to_end;
+	if (expected_seqnum != seqnum) {
+		ksft_print_msg("[%s] expected seqnum at end [%u], got seqnum [%u]\n",
+			       __func__, expected_seqnum, seqnum);
+		goto error;
+	}
+
+	return true;
+
+error:
+	pkt_dump(data, len, !bytes_processed);
+	return false;
+}
+
+static bool is_pkt_valid(struct pkt *pkt, void *buffer, u64 addr, u32 len)
+{
+	if (pkt->len != len) {
+		ksft_print_msg("[%s] expected packet length [%d], got length [%d]\n",
+			       __func__, pkt->len, len);
+		pkt_dump(xsk_umem__get_data(buffer, addr), len, true);
+		return false;
+	}
+
+	return true;
+}
+
+static u32 load_value(u32 *counter)
+{
+	return __atomic_load_n(counter, __ATOMIC_ACQUIRE);
+}
+
+static bool kick_tx_with_check(struct xsk_socket_info *xsk, int *ret)
+{
+	u32 max_budget = MAX_TX_BUDGET_DEFAULT;
+	u32 cons, ready_to_send;
+	int delta;
+
+	cons = load_value(xsk->tx.consumer);
+	ready_to_send = load_value(xsk->tx.producer) - cons;
+	*ret = sendto(xsk_socket__fd(xsk->xsk), NULL, 0, MSG_DONTWAIT, NULL, 0);
+
+	delta = load_value(xsk->tx.consumer) - cons;
+	/* By default, xsk should consume exact @max_budget descs at one
+	 * send in this case where hitting the max budget limit in while
+	 * loop is triggered in __xsk_generic_xmit(). Please make sure that
+	 * the number of descs to be sent is larger than @max_budget, or
+	 * else the tx.consumer will be updated in xskq_cons_peek_desc()
+	 * in time which hides the issue we try to verify.
+	 */
+	if (ready_to_send > max_budget && delta != max_budget)
+		return false;
+
+	return true;
+}
+
+int kick_tx(struct xsk_socket_info *xsk)
+{
+	int ret;
+
+	if (xsk->check_consumer) {
+		if (!kick_tx_with_check(xsk, &ret))
+			return TEST_FAILURE;
+	} else {
+		ret = sendto(xsk_socket__fd(xsk->xsk), NULL, 0, MSG_DONTWAIT, NULL, 0);
+	}
+	if (ret >= 0)
+		return TEST_PASS;
+	if (errno == ENOBUFS || errno == EAGAIN || errno == EBUSY || errno == ENETDOWN) {
+		usleep(100);
+		return TEST_PASS;
+	}
+	return TEST_FAILURE;
+}
+
+int kick_rx(struct xsk_socket_info *xsk)
+{
+	int ret;
+
+	ret = recvfrom(xsk_socket__fd(xsk->xsk), NULL, 0, MSG_DONTWAIT, NULL, NULL);
+	if (ret < 0)
+		return TEST_FAILURE;
+
+	return TEST_PASS;
+}
+
+static int complete_pkts(struct xsk_socket_info *xsk, int batch_size)
+{
+	unsigned int rcvd;
+	u32 idx;
+	int ret;
+
+	if (xsk_ring_prod__needs_wakeup(&xsk->tx)) {
+		ret = kick_tx(xsk);
+		if (ret)
+			return TEST_FAILURE;
+	}
+
+	rcvd = xsk_ring_cons__peek(&xsk->umem->cq, batch_size, &idx);
+	if (rcvd) {
+		if (rcvd > xsk->outstanding_tx) {
+			u64 addr = *xsk_ring_cons__comp_addr(&xsk->umem->cq, idx + rcvd - 1);
+
+			ksft_print_msg("[%s] Too many packets completed\n", __func__);
+			ksft_print_msg("Last completion address: %llx\n",
+				       (unsigned long long)addr);
+			return TEST_FAILURE;
+		}
+
+		xsk_ring_cons__release(&xsk->umem->cq, rcvd);
+		xsk->outstanding_tx -= rcvd;
+	}
+
+	return TEST_PASS;
+}
+
+static int __receive_pkts(struct test_spec *test, struct xsk_socket_info *xsk)
+{
+	u32 frags_processed = 0, nb_frags = 0, pkt_len = 0;
+	u32 idx_rx = 0, idx_fq = 0, rcvd, pkts_sent = 0;
+	struct pkt_stream *pkt_stream = xsk->pkt_stream;
+	struct ifobject *ifobj = test->ifobj_rx;
+	struct xsk_umem_info *umem = xsk->umem;
+	struct pollfd fds = { };
+	struct pkt *pkt;
+	u64 first_addr = 0;
+	int ret;
+
+	fds.fd = xsk_socket__fd(xsk->xsk);
+	fds.events = POLLIN;
+
+	ret = kick_rx(xsk);
+	if (ret)
+		return TEST_FAILURE;
+
+	if (ifobj->use_poll) {
+		ret = poll(&fds, 1, POLL_TMOUT);
+		if (ret < 0)
+			return TEST_FAILURE;
+
+		if (!ret) {
+			if (!is_umem_valid(test->ifobj_tx))
+				return TEST_PASS;
+
+			ksft_print_msg("ERROR: [%s] Poll timed out\n", __func__);
+			return TEST_CONTINUE;
+		}
+
+		if (!(fds.revents & POLLIN))
+			return TEST_CONTINUE;
+	}
+
+	rcvd = xsk_ring_cons__peek(&xsk->rx, xsk->batch_size, &idx_rx);
+	if (!rcvd)
+		return TEST_CONTINUE;
+
+	if (ifobj->use_fill_ring) {
+		ret = xsk_ring_prod__reserve(&umem->fq, rcvd, &idx_fq);
+		while (ret != rcvd) {
+			if (xsk_ring_prod__needs_wakeup(&umem->fq)) {
+				ret = poll(&fds, 1, POLL_TMOUT);
+				if (ret < 0)
+					return TEST_FAILURE;
+			}
+			ret = xsk_ring_prod__reserve(&umem->fq, rcvd, &idx_fq);
+		}
+	}
+
+	while (frags_processed < rcvd) {
+		const struct xdp_desc *desc = xsk_ring_cons__rx_desc(&xsk->rx, idx_rx++);
+		u64 addr = desc->addr, orig;
+
+		orig = xsk_umem__extract_addr(addr);
+		addr = xsk_umem__add_offset_to_addr(addr);
+
+		if (!nb_frags) {
+			pkt = pkt_stream_get_next_rx_pkt(pkt_stream, &pkts_sent);
+			if (!pkt) {
+				ksft_print_msg("[%s] received too many packets addr: %lx len %u\n",
+					       __func__, addr, desc->len);
+				return TEST_FAILURE;
+			}
+		}
+
+		print_verbose("Rx: addr: %lx len: %u options: %u pkt_nb: %u valid: %u\n",
+			      addr, desc->len, desc->options, pkt->pkt_nb, pkt->valid);
+
+		if (!is_frag_valid(umem, addr, desc->len, pkt->pkt_nb, pkt_len) ||
+		    !is_offset_correct(umem, pkt, addr) || (ifobj->use_metadata &&
+		    !is_metadata_correct(pkt, umem->buffer, addr)))
+			return TEST_FAILURE;
+
+		if (!nb_frags++)
+			first_addr = addr;
+		frags_processed++;
+		pkt_len += desc->len;
+		if (ifobj->use_fill_ring)
+			*xsk_ring_prod__fill_addr(&umem->fq, idx_fq++) = orig;
+
+		if (pkt_continues(desc->options))
+			continue;
+
+		/* The complete packet has been received */
+		if (!is_pkt_valid(pkt, umem->buffer, first_addr, pkt_len) ||
+		    !is_offset_correct(umem, pkt, addr))
+			return TEST_FAILURE;
+
+		pkt_stream->nb_rx_pkts++;
+		nb_frags = 0;
+		pkt_len = 0;
+	}
+
+	if (nb_frags) {
+		/* In the middle of a packet. Start over from beginning of packet. */
+		idx_rx -= nb_frags;
+		xsk_ring_cons__cancel(&xsk->rx, nb_frags);
+		if (ifobj->use_fill_ring) {
+			idx_fq -= nb_frags;
+			xsk_ring_prod__cancel(&umem->fq, nb_frags);
+		}
+		frags_processed -= nb_frags;
+	}
+
+	if (ifobj->use_fill_ring)
+		xsk_ring_prod__submit(&umem->fq, frags_processed);
+	if (ifobj->release_rx)
+		xsk_ring_cons__release(&xsk->rx, frags_processed);
+
+	pthread_mutex_lock(&pacing_mutex);
+	pkts_in_flight -= pkts_sent;
+	pthread_mutex_unlock(&pacing_mutex);
+	pkts_sent = 0;
+
+	return TEST_CONTINUE;
+}
+
+bool all_packets_received(struct test_spec *test, struct xsk_socket_info *xsk, u32 sock_num,
+			  unsigned long *bitmap)
+{
+	struct pkt_stream *pkt_stream = xsk->pkt_stream;
+
+	if (!pkt_stream) {
+		__set_bit(sock_num, bitmap);
+		return false;
+	}
+
+	if (pkt_stream->nb_rx_pkts == pkt_stream->nb_valid_entries) {
+		__set_bit(sock_num, bitmap);
+		if (bitmap_full(bitmap, test->nb_sockets))
+			return true;
+	}
+
+	return false;
+}
+
+static int receive_pkts(struct test_spec *test)
+{
+	struct timeval tv_end, tv_now, tv_timeout = {THREAD_TMOUT, 0};
+	DECLARE_BITMAP(bitmap, test->nb_sockets);
+	struct xsk_socket_info *xsk;
+	u32 sock_num = 0;
+	int res, ret;
+
+	ret = gettimeofday(&tv_now, NULL);
+	if (ret)
+		exit_with_error(errno);
+
+	timeradd(&tv_now, &tv_timeout, &tv_end);
+
+	while (1) {
+		xsk = &test->ifobj_rx->xsk_arr[sock_num];
+
+		if ((all_packets_received(test, xsk, sock_num, bitmap)))
+			break;
+
+		res = __receive_pkts(test, xsk);
+		if (!(res == TEST_PASS || res == TEST_CONTINUE))
+			return res;
+
+		ret = gettimeofday(&tv_now, NULL);
+		if (ret)
+			exit_with_error(errno);
+
+		if (timercmp(&tv_now, &tv_end, >)) {
+			ksft_print_msg("ERROR: [%s] Receive loop timed out\n", __func__);
+			return TEST_FAILURE;
+		}
+		sock_num = (sock_num + 1) % test->nb_sockets;
+	}
+
+	return TEST_PASS;
+}
+
+static int __send_pkts(struct ifobject *ifobject, struct xsk_socket_info *xsk, bool timeout)
+{
+	u32 i, idx = 0, valid_pkts = 0, valid_frags = 0, buffer_len;
+	struct pkt_stream *pkt_stream = xsk->pkt_stream;
+	struct xsk_umem_info *umem = ifobject->umem;
+	bool use_poll = ifobject->use_poll;
+	struct pollfd fds = { };
+	int ret;
+
+	buffer_len = pkt_get_buffer_len(umem, pkt_stream->max_pkt_len);
+	/* pkts_in_flight might be negative if many invalid packets are sent */
+	if (pkts_in_flight >= (int)((umem_size(umem) - xsk->batch_size * buffer_len) /
+	    buffer_len)) {
+		ret = kick_tx(xsk);
+		if (ret)
+			return TEST_FAILURE;
+		return TEST_CONTINUE;
+	}
+
+	fds.fd = xsk_socket__fd(xsk->xsk);
+	fds.events = POLLOUT;
+
+	while (xsk_ring_prod__reserve(&xsk->tx, xsk->batch_size, &idx) < xsk->batch_size) {
+		if (use_poll) {
+			ret = poll(&fds, 1, POLL_TMOUT);
+			if (timeout) {
+				if (ret < 0) {
+					ksft_print_msg("ERROR: [%s] Poll error %d\n",
+						       __func__, errno);
+					return TEST_FAILURE;
+				}
+				if (ret == 0)
+					return TEST_PASS;
+				break;
+			}
+			if (ret <= 0) {
+				ksft_print_msg("ERROR: [%s] Poll error %d\n",
+					       __func__, errno);
+				return TEST_FAILURE;
+			}
+		}
+
+		complete_pkts(xsk, xsk->batch_size);
+	}
+
+	for (i = 0; i < xsk->batch_size; i++) {
+		struct pkt *pkt = pkt_stream_get_next_tx_pkt(pkt_stream);
+		u32 nb_frags_left, nb_frags, bytes_written = 0;
+
+		if (!pkt)
+			break;
+
+		nb_frags = pkt_nb_frags(umem->frame_size, pkt_stream, pkt);
+		if (nb_frags > xsk->batch_size - i) {
+			pkt_stream_cancel(pkt_stream);
+			xsk_ring_prod__cancel(&xsk->tx, xsk->batch_size - i);
+			break;
+		}
+		nb_frags_left = nb_frags;
+
+		while (nb_frags_left--) {
+			struct xdp_desc *tx_desc = xsk_ring_prod__tx_desc(&xsk->tx, idx + i);
+
+			tx_desc->addr = pkt_get_addr(pkt, ifobject->umem);
+			if (pkt_stream->verbatim) {
+				tx_desc->len = pkt->len;
+				tx_desc->options = pkt->options;
+			} else if (nb_frags_left) {
+				tx_desc->len = umem->frame_size;
+				tx_desc->options = XDP_PKT_CONTD;
+			} else {
+				tx_desc->len = pkt->len - bytes_written;
+				tx_desc->options = 0;
+			}
+			if (pkt->valid)
+				pkt_generate(xsk, umem, tx_desc->addr, tx_desc->len, pkt->pkt_nb,
+					     bytes_written);
+			bytes_written += tx_desc->len;
+
+			print_verbose("Tx addr: %llx len: %u options: %u pkt_nb: %u\n",
+				      tx_desc->addr, tx_desc->len, tx_desc->options, pkt->pkt_nb);
+
+			if (nb_frags_left) {
+				i++;
+				if (pkt_stream->verbatim)
+					pkt = pkt_stream_get_next_tx_pkt(pkt_stream);
+			}
+		}
+
+		if (pkt && pkt->valid) {
+			valid_pkts++;
+			valid_frags += nb_frags;
+		}
+	}
+
+	pthread_mutex_lock(&pacing_mutex);
+	pkts_in_flight += valid_pkts;
+	pthread_mutex_unlock(&pacing_mutex);
+
+	xsk_ring_prod__submit(&xsk->tx, i);
+	xsk->outstanding_tx += valid_frags;
+
+	if (use_poll) {
+		ret = poll(&fds, 1, POLL_TMOUT);
+		if (ret <= 0) {
+			if (ret == 0 && timeout)
+				return TEST_PASS;
+
+			ksft_print_msg("ERROR: [%s] Poll error %d\n", __func__, ret);
+			return TEST_FAILURE;
+		}
+	}
+
+	if (!timeout) {
+		if (complete_pkts(xsk, i))
+			return TEST_FAILURE;
+
+		usleep(10);
+		return TEST_PASS;
+	}
+
+	return TEST_CONTINUE;
+}
+
+static int wait_for_tx_completion(struct xsk_socket_info *xsk)
+{
+	struct timeval tv_end, tv_now, tv_timeout = {THREAD_TMOUT, 0};
+	int ret;
+
+	ret = gettimeofday(&tv_now, NULL);
+	if (ret)
+		exit_with_error(errno);
+	timeradd(&tv_now, &tv_timeout, &tv_end);
+
+	while (xsk->outstanding_tx) {
+		ret = gettimeofday(&tv_now, NULL);
+		if (ret)
+			exit_with_error(errno);
+		if (timercmp(&tv_now, &tv_end, >)) {
+			ksft_print_msg("ERROR: [%s] Transmission loop timed out\n", __func__);
+			return TEST_FAILURE;
+		}
+
+		complete_pkts(xsk, xsk->batch_size);
+	}
+
+	return TEST_PASS;
+}
+
+bool all_packets_sent(struct test_spec *test, unsigned long *bitmap)
+{
+	return bitmap_full(bitmap, test->nb_sockets);
+}
+
+static int send_pkts(struct test_spec *test, struct ifobject *ifobject)
+{
+	bool timeout = !is_umem_valid(test->ifobj_rx);
+	DECLARE_BITMAP(bitmap, test->nb_sockets);
+	u32 i, ret;
+
+	while (!(all_packets_sent(test, bitmap))) {
+		for (i = 0; i < test->nb_sockets; i++) {
+			struct pkt_stream *pkt_stream;
+
+			pkt_stream = ifobject->xsk_arr[i].pkt_stream;
+			if (!pkt_stream || pkt_stream->current_pkt_nb >= pkt_stream->nb_pkts) {
+				__set_bit(i, bitmap);
+				continue;
+			}
+			ret = __send_pkts(ifobject, &ifobject->xsk_arr[i], timeout);
+			if (ret == TEST_CONTINUE && !test->fail)
+				continue;
+
+			if ((ret || test->fail) && !timeout)
+				return TEST_FAILURE;
+
+			if (ret == TEST_PASS && timeout)
+				return ret;
+
+			ret = wait_for_tx_completion(&ifobject->xsk_arr[i]);
+			if (ret)
+				return TEST_FAILURE;
+		}
+	}
+
+	return TEST_PASS;
+}
+
+static int get_xsk_stats(struct xsk_socket *xsk, struct xdp_statistics *stats)
+{
+	int fd = xsk_socket__fd(xsk), err;
+	socklen_t optlen, expected_len;
+
+	optlen = sizeof(*stats);
+	err = getsockopt(fd, SOL_XDP, XDP_STATISTICS, stats, &optlen);
+	if (err) {
+		ksft_print_msg("[%s] getsockopt(XDP_STATISTICS) error %u %s\n",
+			       __func__, -err, strerror(-err));
+		return TEST_FAILURE;
+	}
+
+	expected_len = sizeof(struct xdp_statistics);
+	if (optlen != expected_len) {
+		ksft_print_msg("[%s] getsockopt optlen error. Expected: %u got: %u\n",
+			       __func__, expected_len, optlen);
+		return TEST_FAILURE;
+	}
+
+	return TEST_PASS;
+}
+
+static int validate_rx_dropped(struct ifobject *ifobject)
+{
+	struct xsk_socket *xsk = ifobject->xsk->xsk;
+	struct xdp_statistics stats;
+	int err;
+
+	err = kick_rx(ifobject->xsk);
+	if (err)
+		return TEST_FAILURE;
+
+	err = get_xsk_stats(xsk, &stats);
+	if (err)
+		return TEST_FAILURE;
+
+	/* The receiver calls getsockopt after receiving the last (valid)
+	 * packet which is not the final packet sent in this test (valid and
+	 * invalid packets are sent in alternating fashion with the final
+	 * packet being invalid). Since the last packet may or may not have
+	 * been dropped already, both outcomes must be allowed.
+	 */
+	if (stats.rx_dropped == ifobject->xsk->pkt_stream->nb_pkts / 2 ||
+	    stats.rx_dropped == ifobject->xsk->pkt_stream->nb_pkts / 2 - 1)
+		return TEST_PASS;
+
+	return TEST_FAILURE;
+}
+
+static int validate_rx_full(struct ifobject *ifobject)
+{
+	struct xsk_socket *xsk = ifobject->xsk->xsk;
+	struct xdp_statistics stats;
+	int err;
+
+	usleep(1000);
+	err = kick_rx(ifobject->xsk);
+	if (err)
+		return TEST_FAILURE;
+
+	err = get_xsk_stats(xsk, &stats);
+	if (err)
+		return TEST_FAILURE;
+
+	if (stats.rx_ring_full)
+		return TEST_PASS;
+
+	return TEST_FAILURE;
+}
+
+static int validate_fill_empty(struct ifobject *ifobject)
+{
+	struct xsk_socket *xsk = ifobject->xsk->xsk;
+	struct xdp_statistics stats;
+	int err;
+
+	usleep(1000);
+	err = kick_rx(ifobject->xsk);
+	if (err)
+		return TEST_FAILURE;
+
+	err = get_xsk_stats(xsk, &stats);
+	if (err)
+		return TEST_FAILURE;
+
+	if (stats.rx_fill_ring_empty_descs)
+		return TEST_PASS;
+
+	return TEST_FAILURE;
+}
+
+static int validate_tx_invalid_descs(struct ifobject *ifobject)
+{
+	struct xsk_socket *xsk = ifobject->xsk->xsk;
+	int fd = xsk_socket__fd(xsk);
+	struct xdp_statistics stats;
+	socklen_t optlen;
+	int err;
+
+	optlen = sizeof(stats);
+	err = getsockopt(fd, SOL_XDP, XDP_STATISTICS, &stats, &optlen);
+	if (err) {
+		ksft_print_msg("[%s] getsockopt(XDP_STATISTICS) error %u %s\n",
+			       __func__, -err, strerror(-err));
+		return TEST_FAILURE;
+	}
+
+	if (stats.tx_invalid_descs != ifobject->xsk->pkt_stream->nb_pkts / 2) {
+		ksft_print_msg("[%s] tx_invalid_descs incorrect. Got [%llu] expected [%u]\n",
+			       __func__,
+			       (unsigned long long)stats.tx_invalid_descs,
+			       ifobject->xsk->pkt_stream->nb_pkts);
+		return TEST_FAILURE;
+	}
+
+	return TEST_PASS;
+}
+
+static void xsk_configure(struct test_spec *test, struct ifobject *ifobject,
+			  struct xsk_umem_info *umem, bool tx)
+{
+	int i, ret;
+
+	for (i = 0; i < test->nb_sockets; i++) {
+		bool shared = (ifobject->shared_umem && tx) ? true : !!i;
+		u32 ctr = 0;
+
+		while (ctr++ < SOCK_RECONF_CTR) {
+			ret = xsk_configure_socket(&ifobject->xsk_arr[i], umem,
+						     ifobject, shared);
+			if (!ret)
+				break;
+
+			/* Retry if it fails as xsk_socket__create() is asynchronous */
+			if (ctr >= SOCK_RECONF_CTR)
+				exit_with_error(-ret);
+			usleep(USLEEP_MAX);
+		}
+		if (ifobject->busy_poll)
+			enable_busy_poll(&ifobject->xsk_arr[i]);
+	}
+}
+
+static void thread_common_ops_tx(struct test_spec *test, struct ifobject *ifobject)
+{
+	xsk_configure(test, ifobject, test->ifobj_rx->umem, true);
+	ifobject->xsk = &ifobject->xsk_arr[0];
+	ifobject->xskmap = test->ifobj_rx->xskmap;
+	memcpy(ifobject->umem, test->ifobj_rx->umem, sizeof(struct xsk_umem_info));
+	ifobject->umem->base_addr = 0;
+}
+
+static void xsk_populate_fill_ring(struct xsk_umem_info *umem, struct pkt_stream *pkt_stream,
+				   bool fill_up)
+{
+	u32 rx_frame_size = umem->frame_size - XDP_PACKET_HEADROOM;
+	u32 idx = 0, filled = 0, buffers_to_fill, nb_pkts;
+	int ret;
+
+	if (umem->num_frames < XSK_RING_PROD__DEFAULT_NUM_DESCS)
+		buffers_to_fill = umem->num_frames;
+	else
+		buffers_to_fill = umem->fill_size;
+
+	ret = xsk_ring_prod__reserve(&umem->fq, buffers_to_fill, &idx);
+	if (ret != buffers_to_fill)
+		exit_with_error(ENOSPC);
+
+	while (filled < buffers_to_fill) {
+		struct pkt *pkt = pkt_stream_get_next_rx_pkt(pkt_stream, &nb_pkts);
+		u64 addr;
+		u32 i;
+
+		for (i = 0; i < pkt_nb_frags(rx_frame_size, pkt_stream, pkt); i++) {
+			if (!pkt) {
+				if (!fill_up)
+					break;
+				addr = filled * umem->frame_size + umem->base_addr;
+			} else if (pkt->offset >= 0) {
+				addr = pkt->offset % umem->frame_size + umem_alloc_buffer(umem);
+			} else {
+				addr = pkt->offset + umem_alloc_buffer(umem);
+			}
+
+			*xsk_ring_prod__fill_addr(&umem->fq, idx++) = addr;
+			if (++filled >= buffers_to_fill)
+				break;
+		}
+	}
+	xsk_ring_prod__submit(&umem->fq, filled);
+	xsk_ring_prod__cancel(&umem->fq, buffers_to_fill - filled);
+
+	pkt_stream_reset(pkt_stream);
+	umem_reset_alloc(umem);
+}
+
+static void thread_common_ops(struct test_spec *test, struct ifobject *ifobject)
+{
+	LIBBPF_OPTS(bpf_xdp_query_opts, opts);
+	int mmap_flags;
+	u64 umem_sz;
+	void *bufs;
+	int ret;
+	u32 i;
+
+	umem_sz = ifobject->umem->num_frames * ifobject->umem->frame_size;
+	mmap_flags = MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE;
+
+	if (ifobject->umem->unaligned_mode)
+		mmap_flags |= MAP_HUGETLB | MAP_HUGE_2MB;
+
+	if (ifobject->shared_umem)
+		umem_sz *= 2;
+
+	bufs = mmap(NULL, umem_sz, PROT_READ | PROT_WRITE, mmap_flags, -1, 0);
+	if (bufs == MAP_FAILED)
+		exit_with_error(errno);
+
+	ret = xsk_configure_umem(ifobject, ifobject->umem, bufs, umem_sz);
+	if (ret)
+		exit_with_error(-ret);
+
+	xsk_configure(test, ifobject, ifobject->umem, false);
+
+	ifobject->xsk = &ifobject->xsk_arr[0];
+
+	if (!ifobject->rx_on)
+		return;
+
+	xsk_populate_fill_ring(ifobject->umem, ifobject->xsk->pkt_stream, ifobject->use_fill_ring);
+
+	for (i = 0; i < test->nb_sockets; i++) {
+		ifobject->xsk = &ifobject->xsk_arr[i];
+		ret = xsk_update_xskmap(ifobject->xskmap, ifobject->xsk->xsk, i);
+		if (ret)
+			exit_with_error(errno);
+	}
+}
+
+void *worker_testapp_validate_tx(void *arg)
+{
+	struct test_spec *test = (struct test_spec *)arg;
+	struct ifobject *ifobject = test->ifobj_tx;
+	int err;
+
+	if (test->current_step == 1) {
+		if (!ifobject->shared_umem)
+			thread_common_ops(test, ifobject);
+		else
+			thread_common_ops_tx(test, ifobject);
+	}
+
+	err = send_pkts(test, ifobject);
+
+	if (!err && ifobject->validation_func)
+		err = ifobject->validation_func(ifobject);
+	if (err)
+		test->fail = true;
+
+	pthread_exit(NULL);
+}
+
+void *worker_testapp_validate_rx(void *arg)
+{
+	struct test_spec *test = (struct test_spec *)arg;
+	struct ifobject *ifobject = test->ifobj_rx;
+	int err;
+
+	if (test->current_step == 1) {
+		thread_common_ops(test, ifobject);
+	} else {
+		xsk_clear_xskmap(ifobject->xskmap);
+		err = xsk_update_xskmap(ifobject->xskmap, ifobject->xsk->xsk, 0);
+		if (err) {
+			ksft_print_msg("Error: Failed to update xskmap, error %s\n",
+				       strerror(-err));
+			exit_with_error(-err);
+		}
+	}
+
+	pthread_barrier_wait(&barr);
+
+	err = receive_pkts(test);
+
+	if (!err && ifobject->validation_func)
+		err = ifobject->validation_func(ifobject);
+
+	if (err) {
+		if (test->adjust_tail && !is_adjust_tail_supported(ifobject->xdp_progs))
+			test->adjust_tail_support = false;
+		else
+			test->fail = true;
+	}
+
+	pthread_exit(NULL);
+}
+
+static void testapp_clean_xsk_umem(struct ifobject *ifobj)
+{
+	u64 umem_sz = ifobj->umem->num_frames * ifobj->umem->frame_size;
+
+	if (ifobj->shared_umem)
+		umem_sz *= 2;
+
+	umem_sz = ceil_u64(umem_sz, HUGEPAGE_SIZE) * HUGEPAGE_SIZE;
+	xsk_umem__delete(ifobj->umem->umem);
+	munmap(ifobj->umem->buffer, umem_sz);
+}
+
+static void handler(int signum)
+{
+	pthread_exit(NULL);
+}
+
+static bool xdp_prog_changed_rx(struct test_spec *test)
+{
+	struct ifobject *ifobj = test->ifobj_rx;
+
+	return ifobj->xdp_prog != test->xdp_prog_rx || ifobj->mode != test->mode;
+}
+
+static bool xdp_prog_changed_tx(struct test_spec *test)
+{
+	struct ifobject *ifobj = test->ifobj_tx;
+
+	return ifobj->xdp_prog != test->xdp_prog_tx || ifobj->mode != test->mode;
+}
+
+static void xsk_reattach_xdp(struct ifobject *ifobj, struct bpf_program *xdp_prog,
+			     struct bpf_map *xskmap, enum test_mode mode)
+{
+	int err;
+
+	xsk_detach_xdp_program(ifobj->ifindex, mode_to_xdp_flags(ifobj->mode));
+	err = xsk_attach_xdp_program(xdp_prog, ifobj->ifindex, mode_to_xdp_flags(mode));
+	if (err) {
+		ksft_print_msg("Error attaching XDP program\n");
+		exit_with_error(-err);
+	}
+
+	if (ifobj->mode != mode && (mode == TEST_MODE_DRV || mode == TEST_MODE_ZC))
+		if (!xsk_is_in_mode(ifobj->ifindex, XDP_FLAGS_DRV_MODE)) {
+			ksft_print_msg("ERROR: XDP prog not in DRV mode\n");
+			exit_with_error(EINVAL);
+		}
+
+	ifobj->xdp_prog = xdp_prog;
+	ifobj->xskmap = xskmap;
+	ifobj->mode = mode;
+}
+
+static void xsk_attach_xdp_progs(struct test_spec *test, struct ifobject *ifobj_rx,
+				 struct ifobject *ifobj_tx)
+{
+	if (xdp_prog_changed_rx(test))
+		xsk_reattach_xdp(ifobj_rx, test->xdp_prog_rx, test->xskmap_rx, test->mode);
+
+	if (!ifobj_tx || ifobj_tx->shared_umem)
+		return;
+
+	if (xdp_prog_changed_tx(test))
+		xsk_reattach_xdp(ifobj_tx, test->xdp_prog_tx, test->xskmap_tx, test->mode);
+}
+
+static int __testapp_validate_traffic(struct test_spec *test, struct ifobject *ifobj1,
+				      struct ifobject *ifobj2)
+{
+	pthread_t t0, t1;
+	int err;
+
+	if (test->mtu > MAX_ETH_PKT_SIZE) {
+		if (test->mode == TEST_MODE_ZC && (!ifobj1->multi_buff_zc_supp ||
+						   (ifobj2 && !ifobj2->multi_buff_zc_supp))) {
+			ksft_print_msg("Multi buffer for zero-copy not supported.\n");
+			return TEST_SKIP;
+		}
+		if (test->mode != TEST_MODE_ZC && (!ifobj1->multi_buff_supp ||
+						   (ifobj2 && !ifobj2->multi_buff_supp))) {
+			ksft_print_msg("Multi buffer not supported.\n");
+			return TEST_SKIP;
+		}
+	}
+	err = test_spec_set_mtu(test, test->mtu);
+	if (err) {
+		ksft_print_msg("Error, could not set mtu.\n");
+		exit_with_error(err);
+	}
+
+	if (ifobj2) {
+		if (pthread_barrier_init(&barr, NULL, 2))
+			exit_with_error(errno);
+		pkt_stream_reset(ifobj2->xsk->pkt_stream);
+	}
+
+	test->current_step++;
+	pkt_stream_reset(ifobj1->xsk->pkt_stream);
+	pkts_in_flight = 0;
+
+	signal(SIGUSR1, handler);
+	/*Spawn RX thread */
+	pthread_create(&t0, NULL, ifobj1->func_ptr, test);
+
+	if (ifobj2) {
+		pthread_barrier_wait(&barr);
+		if (pthread_barrier_destroy(&barr))
+			exit_with_error(errno);
+
+		/*Spawn TX thread */
+		pthread_create(&t1, NULL, ifobj2->func_ptr, test);
+
+		pthread_join(t1, NULL);
+	}
+
+	if (!ifobj2)
+		pthread_kill(t0, SIGUSR1);
+	else
+		pthread_join(t0, NULL);
+
+	if (test->total_steps == test->current_step || test->fail) {
+		u32 i;
+
+		if (ifobj2)
+			for (i = 0; i < test->nb_sockets; i++)
+				xsk_socket__delete(ifobj2->xsk_arr[i].xsk);
+
+		for (i = 0; i < test->nb_sockets; i++)
+			xsk_socket__delete(ifobj1->xsk_arr[i].xsk);
+
+		testapp_clean_xsk_umem(ifobj1);
+		if (ifobj2 && !ifobj2->shared_umem)
+			testapp_clean_xsk_umem(ifobj2);
+	}
+
+	return !!test->fail;
+}
+
+static int testapp_validate_traffic(struct test_spec *test)
+{
+	struct ifobject *ifobj_rx = test->ifobj_rx;
+	struct ifobject *ifobj_tx = test->ifobj_tx;
+
+	if ((ifobj_rx->umem->unaligned_mode && !ifobj_rx->unaligned_supp) ||
+	    (ifobj_tx->umem->unaligned_mode && !ifobj_tx->unaligned_supp)) {
+		ksft_print_msg("No huge pages present.\n");
+		return TEST_SKIP;
+	}
+
+	if (test->set_ring) {
+		if (ifobj_tx->hw_ring_size_supp) {
+			if (set_ring_size(ifobj_tx)) {
+				ksft_print_msg("Failed to change HW ring size.\n");
+				return TEST_FAILURE;
+			}
+		} else {
+			ksft_print_msg("Changing HW ring size not supported.\n");
+			return TEST_SKIP;
+		}
+	}
+
+	xsk_attach_xdp_progs(test, ifobj_rx, ifobj_tx);
+	return __testapp_validate_traffic(test, ifobj_rx, ifobj_tx);
+}
+
+static int testapp_validate_traffic_single_thread(struct test_spec *test, struct ifobject *ifobj)
+{
+	return __testapp_validate_traffic(test, ifobj, NULL);
+}
+
+int testapp_teardown(struct test_spec *test)
+{
+	int i;
+
+	for (i = 0; i < MAX_TEARDOWN_ITER; i++) {
+		if (testapp_validate_traffic(test))
+			return TEST_FAILURE;
+		test_spec_reset(test);
+	}
+
+	return TEST_PASS;
+}
+
+static void swap_directions(struct ifobject **ifobj1, struct ifobject **ifobj2)
+{
+	thread_func_t tmp_func_ptr = (*ifobj1)->func_ptr;
+	struct ifobject *tmp_ifobj = (*ifobj1);
+
+	(*ifobj1)->func_ptr = (*ifobj2)->func_ptr;
+	(*ifobj2)->func_ptr = tmp_func_ptr;
+
+	*ifobj1 = *ifobj2;
+	*ifobj2 = tmp_ifobj;
+}
+
+int testapp_bidirectional(struct test_spec *test)
+{
+	int res;
+
+	test->ifobj_tx->rx_on = true;
+	test->ifobj_rx->tx_on = true;
+	test->total_steps = 2;
+	if (testapp_validate_traffic(test))
+		return TEST_FAILURE;
+
+	print_verbose("Switching Tx/Rx direction\n");
+	swap_directions(&test->ifobj_rx, &test->ifobj_tx);
+	res = __testapp_validate_traffic(test, test->ifobj_rx, test->ifobj_tx);
+
+	swap_directions(&test->ifobj_rx, &test->ifobj_tx);
+	return res;
+}
+
+static int swap_xsk_resources(struct test_spec *test)
+{
+	int ret;
+
+	test->ifobj_tx->xsk_arr[0].pkt_stream = NULL;
+	test->ifobj_rx->xsk_arr[0].pkt_stream = NULL;
+	test->ifobj_tx->xsk_arr[1].pkt_stream = test->tx_pkt_stream_default;
+	test->ifobj_rx->xsk_arr[1].pkt_stream = test->rx_pkt_stream_default;
+	test->ifobj_tx->xsk = &test->ifobj_tx->xsk_arr[1];
+	test->ifobj_rx->xsk = &test->ifobj_rx->xsk_arr[1];
+
+	ret = xsk_update_xskmap(test->ifobj_rx->xskmap, test->ifobj_rx->xsk->xsk, 0);
+	if (ret)
+		return TEST_FAILURE;
+
+	return TEST_PASS;
+}
+
+int testapp_xdp_prog_cleanup(struct test_spec *test)
+{
+	test->total_steps = 2;
+	test->nb_sockets = 2;
+	if (testapp_validate_traffic(test))
+		return TEST_FAILURE;
+
+	if (swap_xsk_resources(test))
+		return TEST_FAILURE;
+	return testapp_validate_traffic(test);
+}
+
+int testapp_headroom(struct test_spec *test)
+{
+	test->ifobj_rx->umem->frame_headroom = UMEM_HEADROOM_TEST_SIZE;
+	return testapp_validate_traffic(test);
+}
+
+int testapp_stats_rx_dropped(struct test_spec *test)
+{
+	if (test->mode == TEST_MODE_ZC) {
+		ksft_print_msg("Can not run RX_DROPPED test for ZC mode\n");
+		return TEST_SKIP;
+	}
+
+	pkt_stream_replace_half(test, MIN_PKT_SIZE * 4, 0);
+	test->ifobj_rx->umem->frame_headroom = test->ifobj_rx->umem->frame_size -
+		XDP_PACKET_HEADROOM - MIN_PKT_SIZE * 3;
+	pkt_stream_receive_half(test);
+	test->ifobj_rx->validation_func = validate_rx_dropped;
+	return testapp_validate_traffic(test);
+}
+
+int testapp_stats_tx_invalid_descs(struct test_spec *test)
+{
+	pkt_stream_replace_half(test, XSK_UMEM__INVALID_FRAME_SIZE, 0);
+	test->ifobj_tx->validation_func = validate_tx_invalid_descs;
+	return testapp_validate_traffic(test);
+}
+
+int testapp_stats_rx_full(struct test_spec *test)
+{
+	pkt_stream_replace(test, DEFAULT_UMEM_BUFFERS + DEFAULT_UMEM_BUFFERS / 2, MIN_PKT_SIZE);
+	test->ifobj_rx->xsk->pkt_stream = pkt_stream_generate(DEFAULT_UMEM_BUFFERS, MIN_PKT_SIZE);
+
+	test->ifobj_rx->xsk->rxqsize = DEFAULT_UMEM_BUFFERS;
+	test->ifobj_rx->release_rx = false;
+	test->ifobj_rx->validation_func = validate_rx_full;
+	return testapp_validate_traffic(test);
+}
+
+int testapp_stats_fill_empty(struct test_spec *test)
+{
+	pkt_stream_replace(test, DEFAULT_UMEM_BUFFERS + DEFAULT_UMEM_BUFFERS / 2, MIN_PKT_SIZE);
+	test->ifobj_rx->xsk->pkt_stream = pkt_stream_generate(DEFAULT_UMEM_BUFFERS, MIN_PKT_SIZE);
+
+	test->ifobj_rx->use_fill_ring = false;
+	test->ifobj_rx->validation_func = validate_fill_empty;
+	return testapp_validate_traffic(test);
+}
+
+int testapp_send_receive_unaligned(struct test_spec *test)
+{
+	test->ifobj_tx->umem->unaligned_mode = true;
+	test->ifobj_rx->umem->unaligned_mode = true;
+	/* Let half of the packets straddle a 4K buffer boundary */
+	pkt_stream_replace_half(test, MIN_PKT_SIZE, -MIN_PKT_SIZE / 2);
+
+	return testapp_validate_traffic(test);
+}
+
+int testapp_send_receive_unaligned_mb(struct test_spec *test)
+{
+	test->mtu = MAX_ETH_JUMBO_SIZE;
+	test->ifobj_tx->umem->unaligned_mode = true;
+	test->ifobj_rx->umem->unaligned_mode = true;
+	pkt_stream_replace(test, DEFAULT_PKT_CNT, MAX_ETH_JUMBO_SIZE);
+	return testapp_validate_traffic(test);
+}
+
+int testapp_single_pkt(struct test_spec *test)
+{
+	struct pkt pkts[] = {{0, MIN_PKT_SIZE, 0, true}};
+
+	pkt_stream_generate_custom(test, pkts, ARRAY_SIZE(pkts));
+	return testapp_validate_traffic(test);
+}
+
+int testapp_send_receive_mb(struct test_spec *test)
+{
+	test->mtu = MAX_ETH_JUMBO_SIZE;
+	pkt_stream_replace(test, DEFAULT_PKT_CNT, MAX_ETH_JUMBO_SIZE);
+
+	return testapp_validate_traffic(test);
+}
+
+int testapp_invalid_desc_mb(struct test_spec *test)
+{
+	struct xsk_umem_info *umem = test->ifobj_tx->umem;
+	u64 umem_size = umem->num_frames * umem->frame_size;
+	struct pkt pkts[] = {
+		/* Valid packet for synch to start with */
+		{0, MIN_PKT_SIZE, 0, true, 0},
+		/* Zero frame len is not legal */
+		{0, XSK_UMEM__LARGE_FRAME_SIZE, 0, false, XDP_PKT_CONTD},
+		{0, XSK_UMEM__LARGE_FRAME_SIZE, 0, false, XDP_PKT_CONTD},
+		{0, 0, 0, false, 0},
+		/* Invalid address in the second frame */
+		{0, XSK_UMEM__LARGE_FRAME_SIZE, 0, false, XDP_PKT_CONTD},
+		{umem_size, XSK_UMEM__LARGE_FRAME_SIZE, 0, false, XDP_PKT_CONTD},
+		/* Invalid len in the middle */
+		{0, XSK_UMEM__LARGE_FRAME_SIZE, 0, false, XDP_PKT_CONTD},
+		{0, XSK_UMEM__INVALID_FRAME_SIZE, 0, false, XDP_PKT_CONTD},
+		/* Invalid options in the middle */
+		{0, XSK_UMEM__LARGE_FRAME_SIZE, 0, false, XDP_PKT_CONTD},
+		{0, XSK_UMEM__LARGE_FRAME_SIZE, 0, false, XSK_DESC__INVALID_OPTION},
+		/* Transmit 2 frags, receive 3 */
+		{0, XSK_UMEM__MAX_FRAME_SIZE, 0, true, XDP_PKT_CONTD},
+		{0, XSK_UMEM__MAX_FRAME_SIZE, 0, true, 0},
+		/* Middle frame crosses chunk boundary with small length */
+		{0, XSK_UMEM__LARGE_FRAME_SIZE, 0, false, XDP_PKT_CONTD},
+		{-MIN_PKT_SIZE / 2, MIN_PKT_SIZE, 0, false, 0},
+		/* Valid packet for synch so that something is received */
+		{0, MIN_PKT_SIZE, 0, true, 0}};
+
+	if (umem->unaligned_mode) {
+		/* Crossing a chunk boundary allowed */
+		pkts[12].valid = true;
+		pkts[13].valid = true;
+	}
+
+	test->mtu = MAX_ETH_JUMBO_SIZE;
+	pkt_stream_generate_custom(test, pkts, ARRAY_SIZE(pkts));
+	return testapp_validate_traffic(test);
+}
+
+int testapp_invalid_desc(struct test_spec *test)
+{
+	struct xsk_umem_info *umem = test->ifobj_tx->umem;
+	u64 umem_size = umem->num_frames * umem->frame_size;
+	struct pkt pkts[] = {
+		/* Zero packet address allowed */
+		{0, MIN_PKT_SIZE, 0, true},
+		/* Allowed packet */
+		{0, MIN_PKT_SIZE, 0, true},
+		/* Straddling the start of umem */
+		{-2, MIN_PKT_SIZE, 0, false},
+		/* Packet too large */
+		{0, XSK_UMEM__INVALID_FRAME_SIZE, 0, false},
+		/* Up to end of umem allowed */
+		{umem_size - MIN_PKT_SIZE - 2 * umem->frame_size, MIN_PKT_SIZE, 0, true},
+		/* After umem ends */
+		{umem_size, MIN_PKT_SIZE, 0, false},
+		/* Straddle the end of umem */
+		{umem_size - MIN_PKT_SIZE / 2, MIN_PKT_SIZE, 0, false},
+		/* Straddle a 4K boundary */
+		{0x1000 - MIN_PKT_SIZE / 2, MIN_PKT_SIZE, 0, false},
+		/* Straddle a 2K boundary */
+		{0x800 - MIN_PKT_SIZE / 2, MIN_PKT_SIZE, 0, true},
+		/* Valid packet for synch so that something is received */
+		{0, MIN_PKT_SIZE, 0, true}};
+
+	if (umem->unaligned_mode) {
+		/* Crossing a page boundary allowed */
+		pkts[7].valid = true;
+	}
+	if (umem->frame_size == XSK_UMEM__DEFAULT_FRAME_SIZE / 2) {
+		/* Crossing a 2K frame size boundary not allowed */
+		pkts[8].valid = false;
+	}
+
+	if (test->ifobj_tx->shared_umem) {
+		pkts[4].offset += umem_size;
+		pkts[5].offset += umem_size;
+		pkts[6].offset += umem_size;
+	}
+
+	pkt_stream_generate_custom(test, pkts, ARRAY_SIZE(pkts));
+	return testapp_validate_traffic(test);
+}
+
+int testapp_xdp_drop(struct test_spec *test)
+{
+	struct xsk_xdp_progs *skel_rx = test->ifobj_rx->xdp_progs;
+	struct xsk_xdp_progs *skel_tx = test->ifobj_tx->xdp_progs;
+
+	test_spec_set_xdp_prog(test, skel_rx->progs.xsk_xdp_drop, skel_tx->progs.xsk_xdp_drop,
+			       skel_rx->maps.xsk, skel_tx->maps.xsk);
+
+	pkt_stream_receive_half(test);
+	return testapp_validate_traffic(test);
+}
+
+int testapp_xdp_metadata_copy(struct test_spec *test)
+{
+	struct xsk_xdp_progs *skel_rx = test->ifobj_rx->xdp_progs;
+	struct xsk_xdp_progs *skel_tx = test->ifobj_tx->xdp_progs;
+
+	test_spec_set_xdp_prog(test, skel_rx->progs.xsk_xdp_populate_metadata,
+			       skel_tx->progs.xsk_xdp_populate_metadata,
+			       skel_rx->maps.xsk, skel_tx->maps.xsk);
+	test->ifobj_rx->use_metadata = true;
+
+	skel_rx->bss->count = 0;
+
+	return testapp_validate_traffic(test);
+}
+
+int testapp_xdp_shared_umem(struct test_spec *test)
+{
+	struct xsk_xdp_progs *skel_rx = test->ifobj_rx->xdp_progs;
+	struct xsk_xdp_progs *skel_tx = test->ifobj_tx->xdp_progs;
+
+	test->total_steps = 1;
+	test->nb_sockets = 2;
+
+	test_spec_set_xdp_prog(test, skel_rx->progs.xsk_xdp_shared_umem,
+			       skel_tx->progs.xsk_xdp_shared_umem,
+			       skel_rx->maps.xsk, skel_tx->maps.xsk);
+
+	pkt_stream_even_odd_sequence(test);
+
+	return testapp_validate_traffic(test);
+}
+
+int testapp_poll_txq_tmout(struct test_spec *test)
+{
+	test->ifobj_tx->use_poll = true;
+	/* create invalid frame by set umem frame_size and pkt length equal to 2048 */
+	test->ifobj_tx->umem->frame_size = 2048;
+	pkt_stream_replace(test, 2 * DEFAULT_PKT_CNT, 2048);
+	return testapp_validate_traffic_single_thread(test, test->ifobj_tx);
+}
+
+int testapp_poll_rxq_tmout(struct test_spec *test)
+{
+	test->ifobj_rx->use_poll = true;
+	return testapp_validate_traffic_single_thread(test, test->ifobj_rx);
+}
+
+int testapp_too_many_frags(struct test_spec *test)
+{
+	struct pkt *pkts;
+	u32 max_frags, i;
+	int ret;
+
+	if (test->mode == TEST_MODE_ZC) {
+		max_frags = test->ifobj_tx->xdp_zc_max_segs;
+	} else {
+		max_frags = get_max_skb_frags();
+		if (!max_frags) {
+			ksft_print_msg("Can't get MAX_SKB_FRAGS from system, using default (17)\n");
+			max_frags = 17;
+		}
+		max_frags += 1;
+	}
+
+	pkts = calloc(2 * max_frags + 2, sizeof(struct pkt));
+	if (!pkts)
+		return TEST_FAILURE;
+
+	test->mtu = MAX_ETH_JUMBO_SIZE;
+
+	/* Valid packet for synch */
+	pkts[0].len = MIN_PKT_SIZE;
+	pkts[0].valid = true;
+
+	/* One valid packet with the max amount of frags */
+	for (i = 1; i < max_frags + 1; i++) {
+		pkts[i].len = MIN_PKT_SIZE;
+		pkts[i].options = XDP_PKT_CONTD;
+		pkts[i].valid = true;
+	}
+	pkts[max_frags].options = 0;
+
+	/* An invalid packet with the max amount of frags but signals packet
+	 * continues on the last frag
+	 */
+	for (i = max_frags + 1; i < 2 * max_frags + 1; i++) {
+		pkts[i].len = MIN_PKT_SIZE;
+		pkts[i].options = XDP_PKT_CONTD;
+		pkts[i].valid = false;
+	}
+
+	/* Valid packet for synch */
+	pkts[2 * max_frags + 1].len = MIN_PKT_SIZE;
+	pkts[2 * max_frags + 1].valid = true;
+
+	pkt_stream_generate_custom(test, pkts, 2 * max_frags + 2);
+	ret = testapp_validate_traffic(test);
+
+	free(pkts);
+	return ret;
+}
+
+static int xsk_load_xdp_programs(struct ifobject *ifobj)
+{
+	ifobj->xdp_progs = xsk_xdp_progs__open_and_load();
+	if (libbpf_get_error(ifobj->xdp_progs))
+		return libbpf_get_error(ifobj->xdp_progs);
+
+	return 0;
+}
+
+/* Simple test */
+static bool hugepages_present(void)
+{
+	size_t mmap_sz = 2 * DEFAULT_UMEM_BUFFERS * XSK_UMEM__DEFAULT_FRAME_SIZE;
+	void *bufs;
+
+	bufs = mmap(NULL, mmap_sz, PROT_READ | PROT_WRITE,
+		    MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, -1, MAP_HUGE_2MB);
+	if (bufs == MAP_FAILED)
+		return false;
+
+	mmap_sz = ceil_u64(mmap_sz, HUGEPAGE_SIZE) * HUGEPAGE_SIZE;
+	munmap(bufs, mmap_sz);
+	return true;
+}
+
+void init_iface(struct ifobject *ifobj, thread_func_t func_ptr)
+{
+	LIBBPF_OPTS(bpf_xdp_query_opts, query_opts);
+	int err;
+
+	ifobj->func_ptr = func_ptr;
+
+	err = xsk_load_xdp_programs(ifobj);
+	if (err) {
+		ksft_print_msg("Error loading XDP program\n");
+		exit_with_error(err);
+	}
+
+	if (hugepages_present())
+		ifobj->unaligned_supp = true;
+
+	err = bpf_xdp_query(ifobj->ifindex, XDP_FLAGS_DRV_MODE, &query_opts);
+	if (err) {
+		ksft_print_msg("Error querying XDP capabilities\n");
+		exit_with_error(-err);
+	}
+	if (query_opts.feature_flags & NETDEV_XDP_ACT_RX_SG)
+		ifobj->multi_buff_supp = true;
+	if (query_opts.feature_flags & NETDEV_XDP_ACT_XSK_ZEROCOPY) {
+		if (query_opts.xdp_zc_max_segs > 1) {
+			ifobj->multi_buff_zc_supp = true;
+			ifobj->xdp_zc_max_segs = query_opts.xdp_zc_max_segs;
+		} else {
+			ifobj->xdp_zc_max_segs = 0;
+		}
+	}
+}
+
+int testapp_send_receive(struct test_spec *test)
+{
+	return testapp_validate_traffic(test);
+}
+
+int testapp_send_receive_2k_frame(struct test_spec *test)
+{
+	test->ifobj_tx->umem->frame_size = 2048;
+	test->ifobj_rx->umem->frame_size = 2048;
+	pkt_stream_replace(test, DEFAULT_PKT_CNT, MIN_PKT_SIZE);
+	return testapp_validate_traffic(test);
+}
+
+int testapp_poll_rx(struct test_spec *test)
+{
+	test->ifobj_rx->use_poll = true;
+	return testapp_validate_traffic(test);
+}
+
+int testapp_poll_tx(struct test_spec *test)
+{
+	test->ifobj_tx->use_poll = true;
+	return testapp_validate_traffic(test);
+}
+
+int testapp_aligned_inv_desc(struct test_spec *test)
+{
+	return testapp_invalid_desc(test);
+}
+
+int testapp_aligned_inv_desc_2k_frame(struct test_spec *test)
+{
+	test->ifobj_tx->umem->frame_size = 2048;
+	test->ifobj_rx->umem->frame_size = 2048;
+	return testapp_invalid_desc(test);
+}
+
+int testapp_unaligned_inv_desc(struct test_spec *test)
+{
+	test->ifobj_tx->umem->unaligned_mode = true;
+	test->ifobj_rx->umem->unaligned_mode = true;
+	return testapp_invalid_desc(test);
+}
+
+int testapp_unaligned_inv_desc_4001_frame(struct test_spec *test)
+{
+	u64 page_size, umem_size;
+
+	/* Odd frame size so the UMEM doesn't end near a page boundary. */
+	test->ifobj_tx->umem->frame_size = 4001;
+	test->ifobj_rx->umem->frame_size = 4001;
+	test->ifobj_tx->umem->unaligned_mode = true;
+	test->ifobj_rx->umem->unaligned_mode = true;
+	/* This test exists to test descriptors that staddle the end of
+	 * the UMEM but not a page.
+	 */
+	page_size = sysconf(_SC_PAGESIZE);
+	umem_size = test->ifobj_tx->umem->num_frames * test->ifobj_tx->umem->frame_size;
+	assert(umem_size % page_size > MIN_PKT_SIZE);
+	assert(umem_size % page_size < page_size - MIN_PKT_SIZE);
+
+	return testapp_invalid_desc(test);
+}
+
+int testapp_aligned_inv_desc_mb(struct test_spec *test)
+{
+	return testapp_invalid_desc_mb(test);
+}
+
+int testapp_unaligned_inv_desc_mb(struct test_spec *test)
+{
+	test->ifobj_tx->umem->unaligned_mode = true;
+	test->ifobj_rx->umem->unaligned_mode = true;
+	return testapp_invalid_desc_mb(test);
+}
+
+int testapp_xdp_metadata(struct test_spec *test)
+{
+	return testapp_xdp_metadata_copy(test);
+}
+
+int testapp_xdp_metadata_mb(struct test_spec *test)
+{
+	test->mtu = MAX_ETH_JUMBO_SIZE;
+	return testapp_xdp_metadata_copy(test);
+}
+
+int testapp_hw_sw_min_ring_size(struct test_spec *test)
+{
+	int ret;
+
+	test->set_ring = true;
+	test->total_steps = 2;
+	test->ifobj_tx->ring.tx_pending = DEFAULT_BATCH_SIZE;
+	test->ifobj_tx->ring.rx_pending = DEFAULT_BATCH_SIZE * 2;
+	test->ifobj_tx->xsk->batch_size = 1;
+	test->ifobj_rx->xsk->batch_size = 1;
+	ret = testapp_validate_traffic(test);
+	if (ret)
+		return ret;
+
+	/* Set batch size to hw_ring_size - 1 */
+	test->ifobj_tx->xsk->batch_size = DEFAULT_BATCH_SIZE - 1;
+	test->ifobj_rx->xsk->batch_size = DEFAULT_BATCH_SIZE - 1;
+	return testapp_validate_traffic(test);
+}
+
+int testapp_hw_sw_max_ring_size(struct test_spec *test)
+{
+	u32 max_descs = XSK_RING_PROD__DEFAULT_NUM_DESCS * 4;
+	int ret;
+
+	test->set_ring = true;
+	test->total_steps = 2;
+	test->ifobj_tx->ring.tx_pending = test->ifobj_tx->ring.tx_max_pending;
+	test->ifobj_tx->ring.rx_pending  = test->ifobj_tx->ring.rx_max_pending;
+	test->ifobj_rx->umem->num_frames = max_descs;
+	test->ifobj_rx->umem->fill_size = max_descs;
+	test->ifobj_rx->umem->comp_size = max_descs;
+	test->ifobj_tx->xsk->batch_size = XSK_RING_PROD__DEFAULT_NUM_DESCS;
+	test->ifobj_rx->xsk->batch_size = XSK_RING_PROD__DEFAULT_NUM_DESCS;
+
+	ret = testapp_validate_traffic(test);
+	if (ret)
+		return ret;
+
+	/* Set batch_size to 8152 for testing, as the ice HW ignores the 3 lowest bits when
+	 * updating the Rx HW tail register.
+	 */
+	test->ifobj_tx->xsk->batch_size = test->ifobj_tx->ring.tx_max_pending - 8;
+	test->ifobj_rx->xsk->batch_size = test->ifobj_tx->ring.tx_max_pending - 8;
+	pkt_stream_replace(test, max_descs, MIN_PKT_SIZE);
+	return testapp_validate_traffic(test);
+}
+
+static int testapp_xdp_adjust_tail(struct test_spec *test, int adjust_value)
+{
+	struct xsk_xdp_progs *skel_rx = test->ifobj_rx->xdp_progs;
+	struct xsk_xdp_progs *skel_tx = test->ifobj_tx->xdp_progs;
+
+	test_spec_set_xdp_prog(test, skel_rx->progs.xsk_xdp_adjust_tail,
+			       skel_tx->progs.xsk_xdp_adjust_tail,
+			       skel_rx->maps.xsk, skel_tx->maps.xsk);
+
+	skel_rx->bss->adjust_value = adjust_value;
+
+	return testapp_validate_traffic(test);
+}
+
+static int testapp_adjust_tail(struct test_spec *test, u32 value, u32 pkt_len)
+{
+	int ret;
+
+	test->adjust_tail_support = true;
+	test->adjust_tail = true;
+	test->total_steps = 1;
+
+	pkt_stream_replace_ifobject(test->ifobj_tx, DEFAULT_BATCH_SIZE, pkt_len);
+	pkt_stream_replace_ifobject(test->ifobj_rx, DEFAULT_BATCH_SIZE, pkt_len + value);
+
+	ret = testapp_xdp_adjust_tail(test, value);
+	if (ret)
+		return ret;
+
+	if (!test->adjust_tail_support) {
+		ksft_print_msg("%s %sResize pkt with bpf_xdp_adjust_tail() not supported\n",
+				      mode_string(test), busy_poll_string(test));
+		return TEST_SKIP;
+	}
+
+	return 0;
+}
+
+int testapp_adjust_tail_shrink(struct test_spec *test)
+{
+	/* Shrink by 4 bytes for testing purpose */
+	return testapp_adjust_tail(test, -4, MIN_PKT_SIZE * 2);
+}
+
+int testapp_adjust_tail_shrink_mb(struct test_spec *test)
+{
+	test->mtu = MAX_ETH_JUMBO_SIZE;
+	/* Shrink by the frag size */
+	return testapp_adjust_tail(test, -XSK_UMEM__MAX_FRAME_SIZE, XSK_UMEM__LARGE_FRAME_SIZE * 2);
+}
+
+int testapp_adjust_tail_grow(struct test_spec *test)
+{
+	/* Grow by 4 bytes for testing purpose */
+	return testapp_adjust_tail(test, 4, MIN_PKT_SIZE * 2);
+}
+
+int testapp_adjust_tail_grow_mb(struct test_spec *test)
+{
+	test->mtu = MAX_ETH_JUMBO_SIZE;
+	/* Grow by (frag_size - last_frag_Size) - 1 to stay inside the last fragment */
+	return testapp_adjust_tail(test, (XSK_UMEM__MAX_FRAME_SIZE / 2) - 1,
+				   XSK_UMEM__LARGE_FRAME_SIZE * 2);
+}
+
+int testapp_tx_queue_consumer(struct test_spec *test)
+{
+	int nr_packets;
+
+	if (test->mode == TEST_MODE_ZC) {
+		ksft_print_msg("Can not run TX_QUEUE_CONSUMER test for ZC mode\n");
+		return TEST_SKIP;
+	}
+
+	nr_packets = MAX_TX_BUDGET_DEFAULT + 1;
+	pkt_stream_replace(test, nr_packets, MIN_PKT_SIZE);
+	test->ifobj_tx->xsk->batch_size = nr_packets;
+	test->ifobj_tx->xsk->check_consumer = true;
+
+	return testapp_validate_traffic(test);
+}
+
+struct ifobject *ifobject_create(void)
+{
+	struct ifobject *ifobj;
+
+	ifobj = calloc(1, sizeof(struct ifobject));
+	if (!ifobj)
+		return NULL;
+
+	ifobj->xsk_arr = calloc(MAX_SOCKETS, sizeof(*ifobj->xsk_arr));
+	if (!ifobj->xsk_arr)
+		goto out_xsk_arr;
+
+	ifobj->umem = calloc(1, sizeof(*ifobj->umem));
+	if (!ifobj->umem)
+		goto out_umem;
+
+	return ifobj;
+
+out_umem:
+	free(ifobj->xsk_arr);
+out_xsk_arr:
+	free(ifobj);
+	return NULL;
+}
+
+void ifobject_delete(struct ifobject *ifobj)
+{
+	free(ifobj->umem);
+	free(ifobj->xsk_arr);
+	free(ifobj);
+}
diff --git a/tools/testing/selftests/bpf/test_xsk.h b/tools/testing/selftests/bpf/test_xsk.h
new file mode 100644
index 0000000000000..fb546cab39fdf
--- /dev/null
+++ b/tools/testing/selftests/bpf/test_xsk.h
@@ -0,0 +1,297 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef TEST_XSK_H_
+#define TEST_XSK_H_
+
+#include <linux/ethtool.h>
+#include <linux/if_xdp.h>
+
+#include "../kselftest.h"
+#include "xsk.h"
+
+#ifndef SO_PREFER_BUSY_POLL
+#define SO_PREFER_BUSY_POLL 69
+#endif
+
+#ifndef SO_BUSY_POLL_BUDGET
+#define SO_BUSY_POLL_BUDGET 70
+#endif
+
+#define TEST_PASS 0
+#define TEST_FAILURE -1
+#define TEST_CONTINUE 1
+#define TEST_SKIP 2
+
+#define DEFAULT_PKT_CNT			(4 * 1024)
+#define DEFAULT_UMEM_BUFFERS		(DEFAULT_PKT_CNT / 4)
+#define HUGEPAGE_SIZE			(2 * 1024 * 1024)
+#define MIN_PKT_SIZE			64
+#define MAX_ETH_PKT_SIZE		1518
+#define MAX_INTERFACE_NAME_CHARS	16
+#define MAX_TEST_NAME_SIZE		48
+#define SOCK_RECONF_CTR			10
+#define USLEEP_MAX			10000
+
+extern bool opt_verbose;
+#define print_verbose(x...) do { if (opt_verbose) ksft_print_msg(x); } while (0)
+
+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, error,
+			      strerror(error));
+	ksft_exit_xfail();
+}
+#define exit_with_error(error) __exit_with_error(error, __FILE__, __func__, __LINE__)
+
+static inline u32 ceil_u32(u32 a, u32 b)
+{
+	return (a + b - 1) / b;
+}
+
+static inline u64 ceil_u64(u64 a, u64 b)
+{
+	return (a + b - 1) / b;
+}
+
+/* Simple test */
+enum test_mode {
+	TEST_MODE_SKB,
+	TEST_MODE_DRV,
+	TEST_MODE_ZC,
+	TEST_MODE_ALL
+};
+
+struct ifobject;
+struct test_spec;
+typedef int (*validation_func_t)(struct ifobject *ifobj);
+typedef void *(*thread_func_t)(void *arg);
+typedef int (*test_func_t)(struct test_spec *test);
+
+struct xsk_socket_info {
+	struct xsk_ring_cons rx;
+	struct xsk_ring_prod tx;
+	struct xsk_umem_info *umem;
+	struct xsk_socket *xsk;
+	struct pkt_stream *pkt_stream;
+	u32 outstanding_tx;
+	u32 rxqsize;
+	u32 batch_size;
+	u8 dst_mac[ETH_ALEN];
+	u8 src_mac[ETH_ALEN];
+	bool check_consumer;
+};
+
+int kick_rx(struct xsk_socket_info *xsk);
+int kick_tx(struct xsk_socket_info *xsk);
+
+struct xsk_umem_info {
+	struct xsk_ring_prod fq;
+	struct xsk_ring_cons cq;
+	struct xsk_umem *umem;
+	u64 next_buffer;
+	u32 num_frames;
+	u32 frame_headroom;
+	void *buffer;
+	u32 frame_size;
+	u32 base_addr;
+	u32 fill_size;
+	u32 comp_size;
+	bool unaligned_mode;
+};
+
+struct set_hw_ring {
+	u32 default_tx;
+	u32 default_rx;
+};
+
+int hw_ring_size_reset(struct ifobject *ifobj);
+
+struct ifobject {
+	char ifname[MAX_INTERFACE_NAME_CHARS];
+	struct xsk_socket_info *xsk;
+	struct xsk_socket_info *xsk_arr;
+	struct xsk_umem_info *umem;
+	thread_func_t func_ptr;
+	validation_func_t validation_func;
+	struct xsk_xdp_progs *xdp_progs;
+	struct bpf_map *xskmap;
+	struct bpf_program *xdp_prog;
+	struct ethtool_ringparam ring;
+	struct set_hw_ring set_ring;
+	enum test_mode mode;
+	int ifindex;
+	int mtu;
+	u32 bind_flags;
+	u32 xdp_zc_max_segs;
+	bool tx_on;
+	bool rx_on;
+	bool use_poll;
+	bool busy_poll;
+	bool use_fill_ring;
+	bool release_rx;
+	bool shared_umem;
+	bool use_metadata;
+	bool unaligned_supp;
+	bool multi_buff_supp;
+	bool multi_buff_zc_supp;
+	bool hw_ring_size_supp;
+};
+struct ifobject *ifobject_create(void);
+void ifobject_delete(struct ifobject *ifobj);
+void init_iface(struct ifobject *ifobj, thread_func_t func_ptr);
+
+int xsk_configure_umem(struct ifobject *ifobj, struct xsk_umem_info *umem, void *buffer, u64 size);
+int xsk_configure_socket(struct xsk_socket_info *xsk, struct xsk_umem_info *umem,
+			 struct ifobject *ifobject, bool shared);
+
+
+struct pkt {
+	int offset;
+	u32 len;
+	u32 pkt_nb;
+	bool valid;
+	u16 options;
+};
+
+struct pkt_stream {
+	u32 nb_pkts;
+	u32 current_pkt_nb;
+	struct pkt *pkts;
+	u32 max_pkt_len;
+	u32 nb_rx_pkts;
+	u32 nb_valid_entries;
+	bool verbatim;
+};
+
+static inline bool pkt_continues(u32 options)
+{
+	return options & XDP_PKT_CONTD;
+}
+
+struct pkt_stream *pkt_stream_generate(u32 nb_pkts, u32 pkt_len);
+void pkt_stream_delete(struct pkt_stream *pkt_stream);
+void pkt_stream_reset(struct pkt_stream *pkt_stream);
+void pkt_stream_restore_default(struct test_spec *test);
+
+struct test_spec {
+	struct ifobject *ifobj_tx;
+	struct ifobject *ifobj_rx;
+	struct pkt_stream *tx_pkt_stream_default;
+	struct pkt_stream *rx_pkt_stream_default;
+	struct bpf_program *xdp_prog_rx;
+	struct bpf_program *xdp_prog_tx;
+	struct bpf_map *xskmap_rx;
+	struct bpf_map *xskmap_tx;
+	test_func_t test_func;
+	int mtu;
+	u16 total_steps;
+	u16 current_step;
+	u16 nb_sockets;
+	bool fail;
+	bool set_ring;
+	bool adjust_tail;
+	bool adjust_tail_support;
+	enum test_mode mode;
+	char name[MAX_TEST_NAME_SIZE];
+};
+
+#define busy_poll_string(test) (test)->ifobj_tx->busy_poll ? "BUSY-POLL " : ""
+static inline char *mode_string(struct test_spec *test)
+{
+	switch (test->mode) {
+	case TEST_MODE_SKB:
+		return "SKB";
+	case TEST_MODE_DRV:
+		return "DRV";
+	case TEST_MODE_ZC:
+		return "ZC";
+	default:
+		return "BOGUS";
+	}
+}
+
+void test_init(struct test_spec *test, struct ifobject *ifobj_tx,
+	       struct ifobject *ifobj_rx, enum test_mode mode,
+	       const struct test_spec *test_to_run);
+
+int testapp_adjust_tail_grow(struct test_spec *test);
+int testapp_adjust_tail_grow_mb(struct test_spec *test);
+int testapp_adjust_tail_shrink(struct test_spec *test);
+int testapp_adjust_tail_shrink_mb(struct test_spec *test);
+int testapp_aligned_inv_desc(struct test_spec *test);
+int testapp_aligned_inv_desc_2k_frame(struct test_spec *test);
+int testapp_aligned_inv_desc_mb(struct test_spec *test);
+int testapp_bidirectional(struct test_spec *test);
+int testapp_headroom(struct test_spec *test);
+int testapp_hw_sw_max_ring_size(struct test_spec *test);
+int testapp_hw_sw_min_ring_size(struct test_spec *test);
+int testapp_poll_rx(struct test_spec *test);
+int testapp_poll_rxq_tmout(struct test_spec *test);
+int testapp_poll_tx(struct test_spec *test);
+int testapp_poll_txq_tmout(struct test_spec *test);
+int testapp_send_receive(struct test_spec *test);
+int testapp_send_receive_2k_frame(struct test_spec *test);
+int testapp_send_receive_mb(struct test_spec *test);
+int testapp_send_receive_unaligned(struct test_spec *test);
+int testapp_send_receive_unaligned_mb(struct test_spec *test);
+int testapp_single_pkt(struct test_spec *test);
+int testapp_stats_fill_empty(struct test_spec *test);
+int testapp_stats_rx_dropped(struct test_spec *test);
+int testapp_stats_tx_invalid_descs(struct test_spec *test);
+int testapp_stats_rx_full(struct test_spec *test);
+int testapp_teardown(struct test_spec *test);
+int testapp_too_many_frags(struct test_spec *test);
+int testapp_tx_queue_consumer(struct test_spec *test);
+int testapp_unaligned_inv_desc(struct test_spec *test);
+int testapp_unaligned_inv_desc_4001_frame(struct test_spec *test);
+int testapp_unaligned_inv_desc_mb(struct test_spec *test);
+int testapp_xdp_drop(struct test_spec *test);
+int testapp_xdp_metadata(struct test_spec *test);
+int testapp_xdp_metadata_mb(struct test_spec *test);
+int testapp_xdp_prog_cleanup(struct test_spec *test);
+int testapp_xdp_shared_umem(struct test_spec *test);
+
+void *worker_testapp_validate_rx(void *arg);
+void *worker_testapp_validate_tx(void *arg);
+
+static const struct test_spec tests[] = {
+	{.name = "SEND_RECEIVE", .test_func = testapp_send_receive},
+	{.name = "SEND_RECEIVE_2K_FRAME", .test_func = testapp_send_receive_2k_frame},
+	{.name = "SEND_RECEIVE_SINGLE_PKT", .test_func = testapp_single_pkt},
+	{.name = "POLL_RX", .test_func = testapp_poll_rx},
+	{.name = "POLL_TX", .test_func = testapp_poll_tx},
+	{.name = "POLL_RXQ_FULL", .test_func = testapp_poll_rxq_tmout},
+	{.name = "POLL_TXQ_FULL", .test_func = testapp_poll_txq_tmout},
+	{.name = "SEND_RECEIVE_UNALIGNED", .test_func = testapp_send_receive_unaligned},
+	{.name = "ALIGNED_INV_DESC", .test_func = testapp_aligned_inv_desc},
+	{.name = "ALIGNED_INV_DESC_2K_FRAME_SIZE", .test_func = testapp_aligned_inv_desc_2k_frame},
+	{.name = "UNALIGNED_INV_DESC", .test_func = testapp_unaligned_inv_desc},
+	{.name = "UNALIGNED_INV_DESC_4001_FRAME_SIZE",
+	 .test_func = testapp_unaligned_inv_desc_4001_frame},
+	{.name = "UMEM_HEADROOM", .test_func = testapp_headroom},
+	{.name = "TEARDOWN", .test_func = testapp_teardown},
+	{.name = "BIDIRECTIONAL", .test_func = testapp_bidirectional},
+	{.name = "STAT_RX_DROPPED", .test_func = testapp_stats_rx_dropped},
+	{.name = "STAT_TX_INVALID", .test_func = testapp_stats_tx_invalid_descs},
+	{.name = "STAT_RX_FULL", .test_func = testapp_stats_rx_full},
+	{.name = "STAT_FILL_EMPTY", .test_func = testapp_stats_fill_empty},
+	{.name = "XDP_PROG_CLEANUP", .test_func = testapp_xdp_prog_cleanup},
+	{.name = "XDP_DROP_HALF", .test_func = testapp_xdp_drop},
+	{.name = "XDP_SHARED_UMEM", .test_func = testapp_xdp_shared_umem},
+	{.name = "XDP_METADATA_COPY", .test_func = testapp_xdp_metadata},
+	{.name = "XDP_METADATA_COPY_MULTI_BUFF", .test_func = testapp_xdp_metadata_mb},
+	{.name = "SEND_RECEIVE_9K_PACKETS", .test_func = testapp_send_receive_mb},
+	{.name = "SEND_RECEIVE_UNALIGNED_9K_PACKETS",
+	 .test_func = testapp_send_receive_unaligned_mb},
+	{.name = "ALIGNED_INV_DESC_MULTI_BUFF", .test_func = testapp_aligned_inv_desc_mb},
+	{.name = "UNALIGNED_INV_DESC_MULTI_BUFF", .test_func = testapp_unaligned_inv_desc_mb},
+	{.name = "TOO_MANY_FRAGS", .test_func = testapp_too_many_frags},
+	{.name = "HW_SW_MIN_RING_SIZE", .test_func = testapp_hw_sw_min_ring_size},
+	{.name = "HW_SW_MAX_RING_SIZE", .test_func = testapp_hw_sw_max_ring_size},
+	{.name = "XDP_ADJUST_TAIL_SHRINK", .test_func = testapp_adjust_tail_shrink},
+	{.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},
+	{.name = "XDP_ADJUST_TAIL_GROW_MULTI_BUFF", .test_func = testapp_adjust_tail_grow_mb},
+	{.name = "TX_QUEUE_CONSUMER", .test_func = testapp_tx_queue_consumer},
+	};
+
+#endif				/* TEST_XSK_H_ */
diff --git a/tools/testing/selftests/bpf/xskxceiver.c b/tools/testing/selftests/bpf/xskxceiver.c
index 352adc8df2d1c..8e108e3162695 100644
--- a/tools/testing/selftests/bpf/xskxceiver.c
+++ b/tools/testing/selftests/bpf/xskxceiver.c
@@ -74,31 +74,23 @@
 #define _GNU_SOURCE
 #include <assert.h>
 #include <fcntl.h>
-#include <errno.h>
 #include <getopt.h>
 #include <linux/if_link.h>
 #include <linux/if_ether.h>
 #include <linux/mman.h>
 #include <linux/netdev.h>
-#include <linux/bitmap.h>
 #include <linux/ethtool.h>
 #include <arpa/inet.h>
 #include <net/if.h>
 #include <locale.h>
-#include <poll.h>
-#include <pthread.h>
-#include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <libgen.h>
-#include <string.h>
 #include <stddef.h>
 #include <sys/mman.h>
-#include <sys/socket.h>
-#include <sys/time.h>
 #include <sys/types.h>
-#include <unistd.h>
 
+#include "test_xsk.h"
 #include "xsk_xdp_progs.skel.h"
 #include "xsk.h"
 #include "xskxceiver.h"
@@ -109,181 +101,12 @@
 
 #include <network_helpers.h>
 
-#define MAX_TX_BUDGET_DEFAULT 32
-
-static bool opt_verbose;
 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, error,
-			      strerror(error));
-	ksft_exit_xfail();
-}
-
-#define exit_with_error(error) __exit_with_error(error, __FILE__, __func__, __LINE__)
-#define busy_poll_string(test) (test)->ifobj_tx->busy_poll ? "BUSY-POLL " : ""
-static char *mode_string(struct test_spec *test)
-{
-	switch (test->mode) {
-	case TEST_MODE_SKB:
-		return "SKB";
-	case TEST_MODE_DRV:
-		return "DRV";
-	case TEST_MODE_ZC:
-		return "ZC";
-	default:
-		return "BOGUS";
-	}
-}
-
-static void report_failure(struct test_spec *test)
-{
-	if (test->fail)
-		return;
-
-	ksft_test_result_fail("FAIL: %s %s%s\n", mode_string(test), busy_poll_string(test),
-			      test->name);
-	test->fail = true;
-}
-
-/* The payload is a word consisting of a packet sequence number in the upper
- * 16-bits and a intra packet data sequence number in the lower 16 bits. So the 3rd packet's
- * 5th word of data will contain the number (2<<16) | 4 as they are numbered from 0.
- */
-static void write_payload(void *dest, u32 pkt_nb, u32 start, u32 size)
-{
-	u32 *ptr = (u32 *)dest, i;
-
-	start /= sizeof(*ptr);
-	size /= sizeof(*ptr);
-	for (i = 0; i < size; i++)
-		ptr[i] = htonl(pkt_nb << 16 | (i + start));
-}
-
-static void gen_eth_hdr(struct xsk_socket_info *xsk, struct ethhdr *eth_hdr)
-{
-	memcpy(eth_hdr->h_dest, xsk->dst_mac, ETH_ALEN);
-	memcpy(eth_hdr->h_source, xsk->src_mac, ETH_ALEN);
-	eth_hdr->h_proto = htons(ETH_P_LOOPBACK);
-}
-
-static bool is_umem_valid(struct ifobject *ifobj)
-{
-	return !!ifobj->umem->umem;
-}
-
-static u32 mode_to_xdp_flags(enum test_mode mode)
-{
-	return (mode == TEST_MODE_SKB) ? XDP_FLAGS_SKB_MODE : XDP_FLAGS_DRV_MODE;
-}
-
-static u64 umem_size(struct xsk_umem_info *umem)
-{
-	return umem->num_frames * umem->frame_size;
-}
-
-static int xsk_configure_umem(struct ifobject *ifobj, struct xsk_umem_info *umem, void *buffer,
-			      u64 size)
-{
-	struct xsk_umem_config cfg = {
-		.fill_size = XSK_RING_PROD__DEFAULT_NUM_DESCS,
-		.comp_size = XSK_RING_CONS__DEFAULT_NUM_DESCS,
-		.frame_size = umem->frame_size,
-		.frame_headroom = umem->frame_headroom,
-		.flags = XSK_UMEM__DEFAULT_FLAGS
-	};
-	int ret;
-
-	if (umem->fill_size)
-		cfg.fill_size = umem->fill_size;
-
-	if (umem->comp_size)
-		cfg.comp_size = umem->comp_size;
-
-	if (umem->unaligned_mode)
-		cfg.flags |= XDP_UMEM_UNALIGNED_CHUNK_FLAG;
-
-	ret = xsk_umem__create(&umem->umem, buffer, size,
-			       &umem->fq, &umem->cq, &cfg);
-	if (ret)
-		return ret;
-
-	umem->buffer = buffer;
-	if (ifobj->shared_umem && ifobj->rx_on) {
-		umem->base_addr = umem_size(umem);
-		umem->next_buffer = umem_size(umem);
-	}
-
-	return 0;
-}
-
-static u64 umem_alloc_buffer(struct xsk_umem_info *umem)
-{
-	u64 addr;
-
-	addr = umem->next_buffer;
-	umem->next_buffer += umem->frame_size;
-	if (umem->next_buffer >= umem->base_addr + umem_size(umem))
-		umem->next_buffer = umem->base_addr;
-
-	return addr;
-}
-
-static void umem_reset_alloc(struct xsk_umem_info *umem)
-{
-	umem->next_buffer = 0;
-}
-
-static void enable_busy_poll(struct xsk_socket_info *xsk)
-{
-	int sock_opt;
-
-	sock_opt = 1;
-	if (setsockopt(xsk_socket__fd(xsk->xsk), SOL_SOCKET, SO_PREFER_BUSY_POLL,
-		       (void *)&sock_opt, sizeof(sock_opt)) < 0)
-		exit_with_error(errno);
-
-	sock_opt = 20;
-	if (setsockopt(xsk_socket__fd(xsk->xsk), SOL_SOCKET, SO_BUSY_POLL,
-		       (void *)&sock_opt, sizeof(sock_opt)) < 0)
-		exit_with_error(errno);
-
-	sock_opt = xsk->batch_size;
-	if (setsockopt(xsk_socket__fd(xsk->xsk), SOL_SOCKET, SO_BUSY_POLL_BUDGET,
-		       (void *)&sock_opt, sizeof(sock_opt)) < 0)
-		exit_with_error(errno);
-}
-
-static int __xsk_configure_socket(struct xsk_socket_info *xsk, struct xsk_umem_info *umem,
-				  struct ifobject *ifobject, bool shared)
-{
-	struct xsk_socket_config cfg = {};
-	struct xsk_ring_cons *rxr;
-	struct xsk_ring_prod *txr;
-
-	xsk->umem = umem;
-	cfg.rx_size = xsk->rxqsize;
-	cfg.tx_size = XSK_RING_PROD__DEFAULT_NUM_DESCS;
-	cfg.bind_flags = ifobject->bind_flags;
-	if (shared)
-		cfg.bind_flags |= XDP_SHARED_UMEM;
-	if (ifobject->mtu > MAX_ETH_PKT_SIZE)
-		cfg.bind_flags |= XDP_USE_SG;
-	if (umem->comp_size)
-		cfg.tx_size = umem->comp_size;
-	if (umem->fill_size)
-		cfg.rx_size = umem->fill_size;
-
-	txr = ifobject->tx_on ? &xsk->tx : NULL;
-	rxr = ifobject->rx_on ? &xsk->rx : NULL;
-	return xsk_socket__create(&xsk->xsk, ifobject->ifindex, 0, umem->umem, rxr, txr, &cfg);
-}
-
 static bool ifobj_zc_avail(struct ifobject *ifobject)
 {
 	size_t umem_sz = DEFAULT_UMEM_BUFFERS * XSK_UMEM__DEFAULT_FRAME_SIZE;
@@ -314,7 +137,7 @@ static bool ifobj_zc_avail(struct ifobject *ifobject)
 	ifobject->bind_flags = XDP_USE_NEED_WAKEUP | XDP_ZEROCOPY;
 	ifobject->rx_on = true;
 	xsk->rxqsize = XSK_RING_CONS__DEFAULT_NUM_DESCS;
-	ret = __xsk_configure_socket(xsk, umem, ifobject, false);
+	ret = xsk_configure_socket(xsk, umem, ifobject, false);
 	if (!ret)
 		zc_avail = true;
 
@@ -327,25 +150,6 @@ static bool ifobj_zc_avail(struct ifobject *ifobject)
 	return zc_avail;
 }
 
-#define MAX_SKB_FRAGS_PATH "/proc/sys/net/core/max_skb_frags"
-static unsigned int get_max_skb_frags(void)
-{
-	unsigned int max_skb_frags = 0;
-	FILE *file;
-
-	file = fopen(MAX_SKB_FRAGS_PATH, "r");
-	if (!file) {
-		ksft_print_msg("Error opening %s\n", MAX_SKB_FRAGS_PATH);
-		return 0;
-	}
-
-	if (fscanf(file, "%u", &max_skb_frags) != 1)
-		ksft_print_msg("Error reading %s\n", MAX_SKB_FRAGS_PATH);
-
-	fclose(file);
-	return max_skb_frags;
-}
-
 static struct option long_options[] = {
 	{"interface", required_argument, 0, 'i'},
 	{"busy-poll", no_argument, 0, 'b'},
@@ -446,2327 +250,66 @@ static void parse_command_line(struct ifobject *ifobj_tx, struct ifobject *ifobj
 	}
 }
 
-static int set_ring_size(struct ifobject *ifobj)
-{
-	int ret;
-	u32 ctr = 0;
-
-	while (ctr++ < SOCK_RECONF_CTR) {
-		ret = set_hw_ring_size(ifobj->ifname, &ifobj->ring);
-		if (!ret)
-			break;
-
-		/* Retry if it fails */
-		if (ctr >= SOCK_RECONF_CTR || errno != EBUSY)
-			return -errno;
-
-		usleep(USLEEP_MAX);
-	}
-
-	return ret;
-}
-
-static int hw_ring_size_reset(struct ifobject *ifobj)
-{
-	ifobj->ring.tx_pending = ifobj->set_ring.default_tx;
-	ifobj->ring.rx_pending = ifobj->set_ring.default_rx;
-	return set_ring_size(ifobj);
-}
-
-static void __test_spec_init(struct test_spec *test, struct ifobject *ifobj_tx,
-			     struct ifobject *ifobj_rx)
+static void xsk_unload_xdp_programs(struct ifobject *ifobj)
 {
-	u32 i, j;
-
-	for (i = 0; i < MAX_INTERFACES; i++) {
-		struct ifobject *ifobj = i ? ifobj_rx : ifobj_tx;
-
-		ifobj->xsk = &ifobj->xsk_arr[0];
-		ifobj->use_poll = false;
-		ifobj->use_fill_ring = true;
-		ifobj->release_rx = true;
-		ifobj->validation_func = NULL;
-		ifobj->use_metadata = false;
-
-		if (i == 0) {
-			ifobj->rx_on = false;
-			ifobj->tx_on = true;
-		} else {
-			ifobj->rx_on = true;
-			ifobj->tx_on = false;
-		}
-
-		memset(ifobj->umem, 0, sizeof(*ifobj->umem));
-		ifobj->umem->num_frames = DEFAULT_UMEM_BUFFERS;
-		ifobj->umem->frame_size = XSK_UMEM__DEFAULT_FRAME_SIZE;
-
-		for (j = 0; j < MAX_SOCKETS; j++) {
-			memset(&ifobj->xsk_arr[j], 0, sizeof(ifobj->xsk_arr[j]));
-			ifobj->xsk_arr[j].rxqsize = XSK_RING_CONS__DEFAULT_NUM_DESCS;
-			ifobj->xsk_arr[j].batch_size = DEFAULT_BATCH_SIZE;
-			if (i == 0)
-				ifobj->xsk_arr[j].pkt_stream = test->tx_pkt_stream_default;
-			else
-				ifobj->xsk_arr[j].pkt_stream = test->rx_pkt_stream_default;
-
-			memcpy(ifobj->xsk_arr[j].src_mac, g_mac, ETH_ALEN);
-			memcpy(ifobj->xsk_arr[j].dst_mac, g_mac, ETH_ALEN);
-			ifobj->xsk_arr[j].src_mac[5] += ((j * 2) + 0);
-			ifobj->xsk_arr[j].dst_mac[5] += ((j * 2) + 1);
-		}
-	}
-
-	if (ifobj_tx->hw_ring_size_supp)
-		hw_ring_size_reset(ifobj_tx);
-
-	test->ifobj_tx = ifobj_tx;
-	test->ifobj_rx = ifobj_rx;
-	test->current_step = 0;
-	test->total_steps = 1;
-	test->nb_sockets = 1;
-	test->fail = false;
-	test->set_ring = false;
-	test->adjust_tail = false;
-	test->adjust_tail_support = false;
-	test->mtu = MAX_ETH_PKT_SIZE;
-	test->xdp_prog_rx = ifobj_rx->xdp_progs->progs.xsk_def_prog;
-	test->xskmap_rx = ifobj_rx->xdp_progs->maps.xsk;
-	test->xdp_prog_tx = ifobj_tx->xdp_progs->progs.xsk_def_prog;
-	test->xskmap_tx = ifobj_tx->xdp_progs->maps.xsk;
+	xsk_xdp_progs__destroy(ifobj->xdp_progs);
 }
 
-static void test_spec_init(struct test_spec *test, struct ifobject *ifobj_tx,
-			   struct ifobject *ifobj_rx, enum test_mode mode,
-			   const struct test_spec *test_to_run)
+static void run_pkt_test(struct test_spec *test)
 {
-	struct pkt_stream *tx_pkt_stream;
-	struct pkt_stream *rx_pkt_stream;
-	u32 i;
-
-	tx_pkt_stream = test->tx_pkt_stream_default;
-	rx_pkt_stream = test->rx_pkt_stream_default;
-	memset(test, 0, sizeof(*test));
-	test->tx_pkt_stream_default = tx_pkt_stream;
-	test->rx_pkt_stream_default = rx_pkt_stream;
+	int ret;
 
-	for (i = 0; i < MAX_INTERFACES; i++) {
-		struct ifobject *ifobj = i ? ifobj_rx : ifobj_tx;
+	ret = test->test_func(test);
 
-		ifobj->bind_flags = XDP_USE_NEED_WAKEUP;
-		if (mode == TEST_MODE_ZC)
-			ifobj->bind_flags |= XDP_ZEROCOPY;
-		else
-			ifobj->bind_flags |= XDP_COPY;
+	switch (ret) {
+	case TEST_PASS:
+		ksft_test_result_pass("PASS: %s %s%s\n", mode_string(test), busy_poll_string(test),
+				      test->name);
+		break;
+	case TEST_SKIP:
+		ksft_test_result_skip("SKIP: %s %s%s\n", mode_string(test), busy_poll_string(test),
+				      test->name);
+		break;
+	case TEST_FAILURE:
+		ksft_test_result_fail("FAIL: %s %s%s\n", mode_string(test), busy_poll_string(test),
+				      test->name);
+		break;
+	default:
+		ksft_test_result_fail("FAIL: %s %s%s -- Unexpected returned value (%d)\n",
+				      mode_string(test), busy_poll_string(test), test->name, ret);
 	}
 
-	strncpy(test->name, test_to_run->name, MAX_TEST_NAME_SIZE);
-	test->test_func = test_to_run->test_func;
-	test->mode = mode;
-	__test_spec_init(test, ifobj_tx, ifobj_rx);
-}
-
-static void test_spec_reset(struct test_spec *test)
-{
-	__test_spec_init(test, test->ifobj_tx, test->ifobj_rx);
+	pkt_stream_restore_default(test);
 }
 
-static void test_spec_set_xdp_prog(struct test_spec *test, struct bpf_program *xdp_prog_rx,
-				   struct bpf_program *xdp_prog_tx, struct bpf_map *xskmap_rx,
-				   struct bpf_map *xskmap_tx)
+static bool is_xdp_supported(int ifindex)
 {
-	test->xdp_prog_rx = xdp_prog_rx;
-	test->xdp_prog_tx = xdp_prog_tx;
-	test->xskmap_rx = xskmap_rx;
-	test->xskmap_tx = xskmap_tx;
-}
+	int flags = XDP_FLAGS_DRV_MODE;
 
-static int test_spec_set_mtu(struct test_spec *test, int mtu)
-{
+	LIBBPF_OPTS(bpf_link_create_opts, opts, .flags = flags);
+	struct bpf_insn insns[2] = {
+		BPF_MOV64_IMM(BPF_REG_0, XDP_PASS),
+		BPF_EXIT_INSN()
+	};
+	int prog_fd, insn_cnt = ARRAY_SIZE(insns);
 	int err;
 
-	if (test->ifobj_rx->mtu != mtu) {
-		err = xsk_set_mtu(test->ifobj_rx->ifindex, mtu);
-		if (err)
-			return err;
-		test->ifobj_rx->mtu = mtu;
-	}
-	if (test->ifobj_tx->mtu != mtu) {
-		err = xsk_set_mtu(test->ifobj_tx->ifindex, mtu);
-		if (err)
-			return err;
-		test->ifobj_tx->mtu = mtu;
-	}
-
-	return 0;
-}
-
-static void pkt_stream_reset(struct pkt_stream *pkt_stream)
-{
-	if (pkt_stream) {
-		pkt_stream->current_pkt_nb = 0;
-		pkt_stream->nb_rx_pkts = 0;
-	}
-}
-
-static struct pkt *pkt_stream_get_next_tx_pkt(struct pkt_stream *pkt_stream)
-{
-	if (pkt_stream->current_pkt_nb >= pkt_stream->nb_pkts)
-		return NULL;
-
-	return &pkt_stream->pkts[pkt_stream->current_pkt_nb++];
-}
-
-static struct pkt *pkt_stream_get_next_rx_pkt(struct pkt_stream *pkt_stream, u32 *pkts_sent)
-{
-	while (pkt_stream->current_pkt_nb < pkt_stream->nb_pkts) {
-		(*pkts_sent)++;
-		if (pkt_stream->pkts[pkt_stream->current_pkt_nb].valid)
-			return &pkt_stream->pkts[pkt_stream->current_pkt_nb++];
-		pkt_stream->current_pkt_nb++;
-	}
-	return NULL;
-}
-
-static void pkt_stream_delete(struct pkt_stream *pkt_stream)
-{
-	free(pkt_stream->pkts);
-	free(pkt_stream);
-}
-
-static void pkt_stream_restore_default(struct test_spec *test)
-{
-	struct pkt_stream *tx_pkt_stream = test->ifobj_tx->xsk->pkt_stream;
-	struct pkt_stream *rx_pkt_stream = test->ifobj_rx->xsk->pkt_stream;
-
-	if (tx_pkt_stream != test->tx_pkt_stream_default) {
-		pkt_stream_delete(test->ifobj_tx->xsk->pkt_stream);
-		test->ifobj_tx->xsk->pkt_stream = test->tx_pkt_stream_default;
-	}
-
-	if (rx_pkt_stream != test->rx_pkt_stream_default) {
-		pkt_stream_delete(test->ifobj_rx->xsk->pkt_stream);
-		test->ifobj_rx->xsk->pkt_stream = test->rx_pkt_stream_default;
-	}
-}
-
-static struct pkt_stream *__pkt_stream_alloc(u32 nb_pkts)
-{
-	struct pkt_stream *pkt_stream;
-
-	pkt_stream = calloc(1, sizeof(*pkt_stream));
-	if (!pkt_stream)
-		return NULL;
-
-	pkt_stream->pkts = calloc(nb_pkts, sizeof(*pkt_stream->pkts));
-	if (!pkt_stream->pkts) {
-		free(pkt_stream);
-		return NULL;
-	}
-
-	pkt_stream->nb_pkts = nb_pkts;
-	return pkt_stream;
-}
-
-static bool pkt_continues(u32 options)
-{
-	return options & XDP_PKT_CONTD;
-}
-
-static u32 ceil_u32(u32 a, u32 b)
-{
-	return (a + b - 1) / b;
-}
-
-static u32 pkt_nb_frags(u32 frame_size, struct pkt_stream *pkt_stream, struct pkt *pkt)
-{
-	u32 nb_frags = 1, next_frag;
-
-	if (!pkt)
-		return 1;
-
-	if (!pkt_stream->verbatim) {
-		if (!pkt->valid || !pkt->len)
-			return 1;
-		return ceil_u32(pkt->len, frame_size);
-	}
-
-	/* Search for the end of the packet in verbatim mode */
-	if (!pkt_continues(pkt->options))
-		return nb_frags;
-
-	next_frag = pkt_stream->current_pkt_nb;
-	pkt++;
-	while (next_frag++ < pkt_stream->nb_pkts) {
-		nb_frags++;
-		if (!pkt_continues(pkt->options) || !pkt->valid)
-			break;
-		pkt++;
-	}
-	return nb_frags;
-}
-
-static bool set_pkt_valid(int offset, u32 len)
-{
-	return len <= MAX_ETH_JUMBO_SIZE;
-}
-
-static void pkt_set(struct pkt_stream *pkt_stream, struct pkt *pkt, int offset, u32 len)
-{
-	pkt->offset = offset;
-	pkt->len = len;
-	pkt->valid = set_pkt_valid(offset, len);
-}
-
-static void pkt_stream_pkt_set(struct pkt_stream *pkt_stream, struct pkt *pkt, int offset, u32 len)
-{
-	bool prev_pkt_valid = pkt->valid;
-
-	pkt_set(pkt_stream, pkt, offset, len);
-	pkt_stream->nb_valid_entries += pkt->valid - prev_pkt_valid;
-}
-
-static u32 pkt_get_buffer_len(struct xsk_umem_info *umem, u32 len)
-{
-	return ceil_u32(len, umem->frame_size) * umem->frame_size;
-}
-
-static struct pkt_stream *__pkt_stream_generate(u32 nb_pkts, u32 pkt_len, u32 nb_start, u32 nb_off)
-{
-	struct pkt_stream *pkt_stream;
-	u32 i;
-
-	pkt_stream = __pkt_stream_alloc(nb_pkts);
-	if (!pkt_stream)
-		exit_with_error(ENOMEM);
-
-	pkt_stream->nb_pkts = nb_pkts;
-	pkt_stream->max_pkt_len = pkt_len;
-	for (i = 0; i < nb_pkts; i++) {
-		struct pkt *pkt = &pkt_stream->pkts[i];
-
-		pkt_stream_pkt_set(pkt_stream, pkt, 0, pkt_len);
-		pkt->pkt_nb = nb_start + i * nb_off;
-	}
-
-	return pkt_stream;
-}
-
-static struct pkt_stream *pkt_stream_generate(u32 nb_pkts, u32 pkt_len)
-{
-	return __pkt_stream_generate(nb_pkts, pkt_len, 0, 1);
-}
-
-static struct pkt_stream *pkt_stream_clone(struct pkt_stream *pkt_stream)
-{
-	return pkt_stream_generate(pkt_stream->nb_pkts, pkt_stream->pkts[0].len);
-}
-
-static void pkt_stream_replace_ifobject(struct ifobject *ifobj, u32 nb_pkts, u32 pkt_len)
-{
-	ifobj->xsk->pkt_stream = pkt_stream_generate(nb_pkts, pkt_len);
-}
-
-static void pkt_stream_replace(struct test_spec *test, u32 nb_pkts, u32 pkt_len)
-{
-	pkt_stream_replace_ifobject(test->ifobj_tx, nb_pkts, pkt_len);
-	pkt_stream_replace_ifobject(test->ifobj_rx, nb_pkts, pkt_len);
-}
-
-static void __pkt_stream_replace_half(struct ifobject *ifobj, u32 pkt_len,
-				      int offset)
-{
-	struct pkt_stream *pkt_stream;
-	u32 i;
-
-	pkt_stream = pkt_stream_clone(ifobj->xsk->pkt_stream);
-	for (i = 1; i < ifobj->xsk->pkt_stream->nb_pkts; i += 2)
-		pkt_stream_pkt_set(pkt_stream, &pkt_stream->pkts[i], offset, pkt_len);
-
-	ifobj->xsk->pkt_stream = pkt_stream;
-}
-
-static void pkt_stream_replace_half(struct test_spec *test, u32 pkt_len, int offset)
-{
-	__pkt_stream_replace_half(test->ifobj_tx, pkt_len, offset);
-	__pkt_stream_replace_half(test->ifobj_rx, pkt_len, offset);
-}
-
-static void pkt_stream_receive_half(struct test_spec *test)
-{
-	struct pkt_stream *pkt_stream = test->ifobj_tx->xsk->pkt_stream;
-	u32 i;
-
-	test->ifobj_rx->xsk->pkt_stream = pkt_stream_generate(pkt_stream->nb_pkts,
-							      pkt_stream->pkts[0].len);
-	pkt_stream = test->ifobj_rx->xsk->pkt_stream;
-	for (i = 1; i < pkt_stream->nb_pkts; i += 2)
-		pkt_stream->pkts[i].valid = false;
-
-	pkt_stream->nb_valid_entries /= 2;
-}
-
-static void pkt_stream_even_odd_sequence(struct test_spec *test)
-{
-	struct pkt_stream *pkt_stream;
-	u32 i;
-
-	for (i = 0; i < test->nb_sockets; i++) {
-		pkt_stream = test->ifobj_tx->xsk_arr[i].pkt_stream;
-		pkt_stream = __pkt_stream_generate(pkt_stream->nb_pkts / 2,
-						   pkt_stream->pkts[0].len, i, 2);
-		test->ifobj_tx->xsk_arr[i].pkt_stream = pkt_stream;
+	prog_fd = bpf_prog_load(BPF_PROG_TYPE_XDP, NULL, "GPL", insns, insn_cnt, NULL);
+	if (prog_fd < 0)
+		return false;
 
-		pkt_stream = test->ifobj_rx->xsk_arr[i].pkt_stream;
-		pkt_stream = __pkt_stream_generate(pkt_stream->nb_pkts / 2,
-						   pkt_stream->pkts[0].len, i, 2);
-		test->ifobj_rx->xsk_arr[i].pkt_stream = pkt_stream;
+	err = bpf_xdp_attach(ifindex, prog_fd, flags, NULL);
+	if (err) {
+		close(prog_fd);
+		return false;
 	}
-}
-
-static u64 pkt_get_addr(struct pkt *pkt, struct xsk_umem_info *umem)
-{
-	if (!pkt->valid)
-		return pkt->offset;
-	return pkt->offset + umem_alloc_buffer(umem);
-}
 
-static void pkt_stream_cancel(struct pkt_stream *pkt_stream)
-{
-	pkt_stream->current_pkt_nb--;
-}
-
-static void pkt_generate(struct xsk_socket_info *xsk, struct xsk_umem_info *umem, u64 addr, u32 len,
-			 u32 pkt_nb, u32 bytes_written)
-{
-	void *data = xsk_umem__get_data(umem->buffer, addr);
-
-	if (len < MIN_PKT_SIZE)
-		return;
-
-	if (!bytes_written) {
-		gen_eth_hdr(xsk, data);
-
-		len -= PKT_HDR_SIZE;
-		data += PKT_HDR_SIZE;
-	} else {
-		bytes_written -= PKT_HDR_SIZE;
-	}
+	bpf_xdp_detach(ifindex, flags, NULL);
+	close(prog_fd);
 
-	write_payload(data, pkt_nb, bytes_written, len);
+	return true;
 }
 
-static struct pkt_stream *__pkt_stream_generate_custom(struct ifobject *ifobj, struct pkt *frames,
-						       u32 nb_frames, bool verbatim)
-{
-	u32 i, len = 0, pkt_nb = 0, payload = 0;
-	struct pkt_stream *pkt_stream;
-
-	pkt_stream = __pkt_stream_alloc(nb_frames);
-	if (!pkt_stream)
-		exit_with_error(ENOMEM);
-
-	for (i = 0; i < nb_frames; i++) {
-		struct pkt *pkt = &pkt_stream->pkts[pkt_nb];
-		struct pkt *frame = &frames[i];
-
-		pkt->offset = frame->offset;
-		if (verbatim) {
-			*pkt = *frame;
-			pkt->pkt_nb = payload;
-			if (!frame->valid || !pkt_continues(frame->options))
-				payload++;
-		} else {
-			if (frame->valid)
-				len += frame->len;
-			if (frame->valid && pkt_continues(frame->options))
-				continue;
-
-			pkt->pkt_nb = pkt_nb;
-			pkt->len = len;
-			pkt->valid = frame->valid;
-			pkt->options = 0;
-
-			len = 0;
-		}
-
-		print_verbose("offset: %d len: %u valid: %u options: %u pkt_nb: %u\n",
-			      pkt->offset, pkt->len, pkt->valid, pkt->options, pkt->pkt_nb);
-
-		if (pkt->valid && pkt->len > pkt_stream->max_pkt_len)
-			pkt_stream->max_pkt_len = pkt->len;
-
-		if (pkt->valid)
-			pkt_stream->nb_valid_entries++;
-
-		pkt_nb++;
-	}
-
-	pkt_stream->nb_pkts = pkt_nb;
-	pkt_stream->verbatim = verbatim;
-	return pkt_stream;
-}
-
-static void pkt_stream_generate_custom(struct test_spec *test, struct pkt *pkts, u32 nb_pkts)
-{
-	struct pkt_stream *pkt_stream;
-
-	pkt_stream = __pkt_stream_generate_custom(test->ifobj_tx, pkts, nb_pkts, true);
-	test->ifobj_tx->xsk->pkt_stream = pkt_stream;
-
-	pkt_stream = __pkt_stream_generate_custom(test->ifobj_rx, pkts, nb_pkts, false);
-	test->ifobj_rx->xsk->pkt_stream = pkt_stream;
-}
-
-static void pkt_print_data(u32 *data, u32 cnt)
-{
-	u32 i;
-
-	for (i = 0; i < cnt; i++) {
-		u32 seqnum, pkt_nb;
-
-		seqnum = ntohl(*data) & 0xffff;
-		pkt_nb = ntohl(*data) >> 16;
-		ksft_print_msg("%u:%u ", pkt_nb, seqnum);
-		data++;
-	}
-}
-
-static void pkt_dump(void *pkt, u32 len, bool eth_header)
-{
-	struct ethhdr *ethhdr = pkt;
-	u32 i, *data;
-
-	if (eth_header) {
-		/*extract L2 frame */
-		ksft_print_msg("DEBUG>> L2: dst mac: ");
-		for (i = 0; i < ETH_ALEN; i++)
-			ksft_print_msg("%02X", ethhdr->h_dest[i]);
-
-		ksft_print_msg("\nDEBUG>> L2: src mac: ");
-		for (i = 0; i < ETH_ALEN; i++)
-			ksft_print_msg("%02X", ethhdr->h_source[i]);
-
-		data = pkt + PKT_HDR_SIZE;
-	} else {
-		data = pkt;
-	}
-
-	/*extract L5 frame */
-	ksft_print_msg("\nDEBUG>> L5: seqnum: ");
-	pkt_print_data(data, PKT_DUMP_NB_TO_PRINT);
-	ksft_print_msg("....");
-	if (len > PKT_DUMP_NB_TO_PRINT * sizeof(u32)) {
-		ksft_print_msg("\n.... ");
-		pkt_print_data(data + len / sizeof(u32) - PKT_DUMP_NB_TO_PRINT,
-			       PKT_DUMP_NB_TO_PRINT);
-	}
-	ksft_print_msg("\n---------------------------------------\n");
-}
-
-static bool is_offset_correct(struct xsk_umem_info *umem, struct pkt *pkt, u64 addr)
-{
-	u32 headroom = umem->unaligned_mode ? 0 : umem->frame_headroom;
-	u32 offset = addr % umem->frame_size, expected_offset;
-	int pkt_offset = pkt->valid ? pkt->offset : 0;
-
-	if (!umem->unaligned_mode)
-		pkt_offset = 0;
-
-	expected_offset = (pkt_offset + headroom + XDP_PACKET_HEADROOM) % umem->frame_size;
-
-	if (offset == expected_offset)
-		return true;
-
-	ksft_print_msg("[%s] expected [%u], got [%u]\n", __func__, expected_offset, offset);
-	return false;
-}
-
-static bool is_metadata_correct(struct pkt *pkt, void *buffer, u64 addr)
-{
-	void *data = xsk_umem__get_data(buffer, addr);
-	struct xdp_info *meta = data - sizeof(struct xdp_info);
-
-	if (meta->count != pkt->pkt_nb) {
-		ksft_print_msg("[%s] expected meta_count [%d], got meta_count [%llu]\n",
-			       __func__, pkt->pkt_nb,
-			       (unsigned long long)meta->count);
-		return false;
-	}
-
-	return true;
-}
-
-static bool is_adjust_tail_supported(struct xsk_xdp_progs *skel_rx)
-{
-	struct bpf_map *data_map;
-	int adjust_value = 0;
-	int key = 0;
-	int ret;
-
-	data_map = bpf_object__find_map_by_name(skel_rx->obj, "xsk_xdp_.bss");
-	if (!data_map || !bpf_map__is_internal(data_map)) {
-		ksft_print_msg("Error: could not find bss section of XDP program\n");
-		exit_with_error(errno);
-	}
-
-	ret = bpf_map_lookup_elem(bpf_map__fd(data_map), &key, &adjust_value);
-	if (ret) {
-		ksft_print_msg("Error: bpf_map_lookup_elem failed with error %d\n", ret);
-		exit_with_error(errno);
-	}
-
-	/* Set the 'adjust_value' variable to -EOPNOTSUPP in the XDP program if the adjust_tail
-	 * helper is not supported. Skip the adjust_tail test case in this scenario.
-	 */
-	return adjust_value != -EOPNOTSUPP;
-}
-
-static bool is_frag_valid(struct xsk_umem_info *umem, u64 addr, u32 len, u32 expected_pkt_nb,
-			  u32 bytes_processed)
-{
-	u32 seqnum, pkt_nb, *pkt_data, words_to_end, expected_seqnum;
-	void *data = xsk_umem__get_data(umem->buffer, addr);
-
-	addr -= umem->base_addr;
-
-	if (addr >= umem->num_frames * umem->frame_size ||
-	    addr + len > umem->num_frames * umem->frame_size) {
-		ksft_print_msg("Frag invalid addr: %llx len: %u\n",
-			       (unsigned long long)addr, len);
-		return false;
-	}
-	if (!umem->unaligned_mode && addr % umem->frame_size + len > umem->frame_size) {
-		ksft_print_msg("Frag crosses frame boundary addr: %llx len: %u\n",
-			       (unsigned long long)addr, len);
-		return false;
-	}
-
-	pkt_data = data;
-	if (!bytes_processed) {
-		pkt_data += PKT_HDR_SIZE / sizeof(*pkt_data);
-		len -= PKT_HDR_SIZE;
-	} else {
-		bytes_processed -= PKT_HDR_SIZE;
-	}
-
-	expected_seqnum = bytes_processed / sizeof(*pkt_data);
-	seqnum = ntohl(*pkt_data) & 0xffff;
-	pkt_nb = ntohl(*pkt_data) >> 16;
-
-	if (expected_pkt_nb != pkt_nb) {
-		ksft_print_msg("[%s] expected pkt_nb [%u], got pkt_nb [%u]\n",
-			       __func__, expected_pkt_nb, pkt_nb);
-		goto error;
-	}
-	if (expected_seqnum != seqnum) {
-		ksft_print_msg("[%s] expected seqnum at start [%u], got seqnum [%u]\n",
-			       __func__, expected_seqnum, seqnum);
-		goto error;
-	}
-
-	words_to_end = len / sizeof(*pkt_data) - 1;
-	pkt_data += words_to_end;
-	seqnum = ntohl(*pkt_data) & 0xffff;
-	expected_seqnum += words_to_end;
-	if (expected_seqnum != seqnum) {
-		ksft_print_msg("[%s] expected seqnum at end [%u], got seqnum [%u]\n",
-			       __func__, expected_seqnum, seqnum);
-		goto error;
-	}
-
-	return true;
-
-error:
-	pkt_dump(data, len, !bytes_processed);
-	return false;
-}
-
-static bool is_pkt_valid(struct pkt *pkt, void *buffer, u64 addr, u32 len)
-{
-	if (pkt->len != len) {
-		ksft_print_msg("[%s] expected packet length [%d], got length [%d]\n",
-			       __func__, pkt->len, len);
-		pkt_dump(xsk_umem__get_data(buffer, addr), len, true);
-		return false;
-	}
-
-	return true;
-}
-
-static u32 load_value(u32 *counter)
-{
-	return __atomic_load_n(counter, __ATOMIC_ACQUIRE);
-}
-
-static bool kick_tx_with_check(struct xsk_socket_info *xsk, int *ret)
-{
-	u32 max_budget = MAX_TX_BUDGET_DEFAULT;
-	u32 cons, ready_to_send;
-	int delta;
-
-	cons = load_value(xsk->tx.consumer);
-	ready_to_send = load_value(xsk->tx.producer) - cons;
-	*ret = sendto(xsk_socket__fd(xsk->xsk), NULL, 0, MSG_DONTWAIT, NULL, 0);
-
-	delta = load_value(xsk->tx.consumer) - cons;
-	/* By default, xsk should consume exact @max_budget descs at one
-	 * send in this case where hitting the max budget limit in while
-	 * loop is triggered in __xsk_generic_xmit(). Please make sure that
-	 * the number of descs to be sent is larger than @max_budget, or
-	 * else the tx.consumer will be updated in xskq_cons_peek_desc()
-	 * in time which hides the issue we try to verify.
-	 */
-	if (ready_to_send > max_budget && delta != max_budget)
-		return false;
-
-	return true;
-}
-
-static int kick_tx(struct xsk_socket_info *xsk)
-{
-	int ret;
-
-	if (xsk->check_consumer) {
-		if (!kick_tx_with_check(xsk, &ret))
-			return TEST_FAILURE;
-	} else {
-		ret = sendto(xsk_socket__fd(xsk->xsk), NULL, 0, MSG_DONTWAIT, NULL, 0);
-	}
-	if (ret >= 0)
-		return TEST_PASS;
-	if (errno == ENOBUFS || errno == EAGAIN || errno == EBUSY || errno == ENETDOWN) {
-		usleep(100);
-		return TEST_PASS;
-	}
-	return TEST_FAILURE;
-}
-
-static int kick_rx(struct xsk_socket_info *xsk)
-{
-	int ret;
-
-	ret = recvfrom(xsk_socket__fd(xsk->xsk), NULL, 0, MSG_DONTWAIT, NULL, NULL);
-	if (ret < 0)
-		return TEST_FAILURE;
-
-	return TEST_PASS;
-}
-
-static int complete_pkts(struct xsk_socket_info *xsk, int batch_size)
-{
-	unsigned int rcvd;
-	u32 idx;
-	int ret;
-
-	if (xsk_ring_prod__needs_wakeup(&xsk->tx)) {
-		ret = kick_tx(xsk);
-		if (ret)
-			return TEST_FAILURE;
-	}
-
-	rcvd = xsk_ring_cons__peek(&xsk->umem->cq, batch_size, &idx);
-	if (rcvd) {
-		if (rcvd > xsk->outstanding_tx) {
-			u64 addr = *xsk_ring_cons__comp_addr(&xsk->umem->cq, idx + rcvd - 1);
-
-			ksft_print_msg("[%s] Too many packets completed\n", __func__);
-			ksft_print_msg("Last completion address: %llx\n",
-				       (unsigned long long)addr);
-			return TEST_FAILURE;
-		}
-
-		xsk_ring_cons__release(&xsk->umem->cq, rcvd);
-		xsk->outstanding_tx -= rcvd;
-	}
-
-	return TEST_PASS;
-}
-
-static int __receive_pkts(struct test_spec *test, struct xsk_socket_info *xsk)
-{
-	u32 frags_processed = 0, nb_frags = 0, pkt_len = 0;
-	u32 idx_rx = 0, idx_fq = 0, rcvd, pkts_sent = 0;
-	struct pkt_stream *pkt_stream = xsk->pkt_stream;
-	struct ifobject *ifobj = test->ifobj_rx;
-	struct xsk_umem_info *umem = xsk->umem;
-	struct pollfd fds = { };
-	struct pkt *pkt;
-	u64 first_addr = 0;
-	int ret;
-
-	fds.fd = xsk_socket__fd(xsk->xsk);
-	fds.events = POLLIN;
-
-	ret = kick_rx(xsk);
-	if (ret)
-		return TEST_FAILURE;
-
-	if (ifobj->use_poll) {
-		ret = poll(&fds, 1, POLL_TMOUT);
-		if (ret < 0)
-			return TEST_FAILURE;
-
-		if (!ret) {
-			if (!is_umem_valid(test->ifobj_tx))
-				return TEST_PASS;
-
-			ksft_print_msg("ERROR: [%s] Poll timed out\n", __func__);
-			return TEST_CONTINUE;
-		}
-
-		if (!(fds.revents & POLLIN))
-			return TEST_CONTINUE;
-	}
-
-	rcvd = xsk_ring_cons__peek(&xsk->rx, xsk->batch_size, &idx_rx);
-	if (!rcvd)
-		return TEST_CONTINUE;
-
-	if (ifobj->use_fill_ring) {
-		ret = xsk_ring_prod__reserve(&umem->fq, rcvd, &idx_fq);
-		while (ret != rcvd) {
-			if (xsk_ring_prod__needs_wakeup(&umem->fq)) {
-				ret = poll(&fds, 1, POLL_TMOUT);
-				if (ret < 0)
-					return TEST_FAILURE;
-			}
-			ret = xsk_ring_prod__reserve(&umem->fq, rcvd, &idx_fq);
-		}
-	}
-
-	while (frags_processed < rcvd) {
-		const struct xdp_desc *desc = xsk_ring_cons__rx_desc(&xsk->rx, idx_rx++);
-		u64 addr = desc->addr, orig;
-
-		orig = xsk_umem__extract_addr(addr);
-		addr = xsk_umem__add_offset_to_addr(addr);
-
-		if (!nb_frags) {
-			pkt = pkt_stream_get_next_rx_pkt(pkt_stream, &pkts_sent);
-			if (!pkt) {
-				ksft_print_msg("[%s] received too many packets addr: %lx len %u\n",
-					       __func__, addr, desc->len);
-				return TEST_FAILURE;
-			}
-		}
-
-		print_verbose("Rx: addr: %lx len: %u options: %u pkt_nb: %u valid: %u\n",
-			      addr, desc->len, desc->options, pkt->pkt_nb, pkt->valid);
-
-		if (!is_frag_valid(umem, addr, desc->len, pkt->pkt_nb, pkt_len) ||
-		    !is_offset_correct(umem, pkt, addr) || (ifobj->use_metadata &&
-		    !is_metadata_correct(pkt, umem->buffer, addr)))
-			return TEST_FAILURE;
-
-		if (!nb_frags++)
-			first_addr = addr;
-		frags_processed++;
-		pkt_len += desc->len;
-		if (ifobj->use_fill_ring)
-			*xsk_ring_prod__fill_addr(&umem->fq, idx_fq++) = orig;
-
-		if (pkt_continues(desc->options))
-			continue;
-
-		/* The complete packet has been received */
-		if (!is_pkt_valid(pkt, umem->buffer, first_addr, pkt_len) ||
-		    !is_offset_correct(umem, pkt, addr))
-			return TEST_FAILURE;
-
-		pkt_stream->nb_rx_pkts++;
-		nb_frags = 0;
-		pkt_len = 0;
-	}
-
-	if (nb_frags) {
-		/* In the middle of a packet. Start over from beginning of packet. */
-		idx_rx -= nb_frags;
-		xsk_ring_cons__cancel(&xsk->rx, nb_frags);
-		if (ifobj->use_fill_ring) {
-			idx_fq -= nb_frags;
-			xsk_ring_prod__cancel(&umem->fq, nb_frags);
-		}
-		frags_processed -= nb_frags;
-	}
-
-	if (ifobj->use_fill_ring)
-		xsk_ring_prod__submit(&umem->fq, frags_processed);
-	if (ifobj->release_rx)
-		xsk_ring_cons__release(&xsk->rx, frags_processed);
-
-	pthread_mutex_lock(&pacing_mutex);
-	pkts_in_flight -= pkts_sent;
-	pthread_mutex_unlock(&pacing_mutex);
-	pkts_sent = 0;
-
-return TEST_CONTINUE;
-}
-
-bool all_packets_received(struct test_spec *test, struct xsk_socket_info *xsk, u32 sock_num,
-			  unsigned long *bitmap)
-{
-	struct pkt_stream *pkt_stream = xsk->pkt_stream;
-
-	if (!pkt_stream) {
-		__set_bit(sock_num, bitmap);
-		return false;
-	}
-
-	if (pkt_stream->nb_rx_pkts == pkt_stream->nb_valid_entries) {
-		__set_bit(sock_num, bitmap);
-		if (bitmap_full(bitmap, test->nb_sockets))
-			return true;
-	}
-
-	return false;
-}
-
-static int receive_pkts(struct test_spec *test)
-{
-	struct timeval tv_end, tv_now, tv_timeout = {THREAD_TMOUT, 0};
-	DECLARE_BITMAP(bitmap, test->nb_sockets);
-	struct xsk_socket_info *xsk;
-	u32 sock_num = 0;
-	int res, ret;
-
-	ret = gettimeofday(&tv_now, NULL);
-	if (ret)
-		exit_with_error(errno);
-
-	timeradd(&tv_now, &tv_timeout, &tv_end);
-
-	while (1) {
-		xsk = &test->ifobj_rx->xsk_arr[sock_num];
-
-		if ((all_packets_received(test, xsk, sock_num, bitmap)))
-			break;
-
-		res = __receive_pkts(test, xsk);
-		if (!(res == TEST_PASS || res == TEST_CONTINUE))
-			return res;
-
-		ret = gettimeofday(&tv_now, NULL);
-		if (ret)
-			exit_with_error(errno);
-
-		if (timercmp(&tv_now, &tv_end, >)) {
-			ksft_print_msg("ERROR: [%s] Receive loop timed out\n", __func__);
-			return TEST_FAILURE;
-		}
-		sock_num = (sock_num + 1) % test->nb_sockets;
-	}
-
-	return TEST_PASS;
-}
-
-static int __send_pkts(struct ifobject *ifobject, struct xsk_socket_info *xsk, bool timeout)
-{
-	u32 i, idx = 0, valid_pkts = 0, valid_frags = 0, buffer_len;
-	struct pkt_stream *pkt_stream = xsk->pkt_stream;
-	struct xsk_umem_info *umem = ifobject->umem;
-	bool use_poll = ifobject->use_poll;
-	struct pollfd fds = { };
-	int ret;
-
-	buffer_len = pkt_get_buffer_len(umem, pkt_stream->max_pkt_len);
-	/* pkts_in_flight might be negative if many invalid packets are sent */
-	if (pkts_in_flight >= (int)((umem_size(umem) - xsk->batch_size * buffer_len) /
-	    buffer_len)) {
-		ret = kick_tx(xsk);
-		if (ret)
-			return TEST_FAILURE;
-		return TEST_CONTINUE;
-	}
-
-	fds.fd = xsk_socket__fd(xsk->xsk);
-	fds.events = POLLOUT;
-
-	while (xsk_ring_prod__reserve(&xsk->tx, xsk->batch_size, &idx) < xsk->batch_size) {
-		if (use_poll) {
-			ret = poll(&fds, 1, POLL_TMOUT);
-			if (timeout) {
-				if (ret < 0) {
-					ksft_print_msg("ERROR: [%s] Poll error %d\n",
-						       __func__, errno);
-					return TEST_FAILURE;
-				}
-				if (ret == 0)
-					return TEST_PASS;
-				break;
-			}
-			if (ret <= 0) {
-				ksft_print_msg("ERROR: [%s] Poll error %d\n",
-					       __func__, errno);
-				return TEST_FAILURE;
-			}
-		}
-
-		complete_pkts(xsk, xsk->batch_size);
-	}
-
-	for (i = 0; i < xsk->batch_size; i++) {
-		struct pkt *pkt = pkt_stream_get_next_tx_pkt(pkt_stream);
-		u32 nb_frags_left, nb_frags, bytes_written = 0;
-
-		if (!pkt)
-			break;
-
-		nb_frags = pkt_nb_frags(umem->frame_size, pkt_stream, pkt);
-		if (nb_frags > xsk->batch_size - i) {
-			pkt_stream_cancel(pkt_stream);
-			xsk_ring_prod__cancel(&xsk->tx, xsk->batch_size - i);
-			break;
-		}
-		nb_frags_left = nb_frags;
-
-		while (nb_frags_left--) {
-			struct xdp_desc *tx_desc = xsk_ring_prod__tx_desc(&xsk->tx, idx + i);
-
-			tx_desc->addr = pkt_get_addr(pkt, ifobject->umem);
-			if (pkt_stream->verbatim) {
-				tx_desc->len = pkt->len;
-				tx_desc->options = pkt->options;
-			} else if (nb_frags_left) {
-				tx_desc->len = umem->frame_size;
-				tx_desc->options = XDP_PKT_CONTD;
-			} else {
-				tx_desc->len = pkt->len - bytes_written;
-				tx_desc->options = 0;
-			}
-			if (pkt->valid)
-				pkt_generate(xsk, umem, tx_desc->addr, tx_desc->len, pkt->pkt_nb,
-					     bytes_written);
-			bytes_written += tx_desc->len;
-
-			print_verbose("Tx addr: %llx len: %u options: %u pkt_nb: %u\n",
-				      tx_desc->addr, tx_desc->len, tx_desc->options, pkt->pkt_nb);
-
-			if (nb_frags_left) {
-				i++;
-				if (pkt_stream->verbatim)
-					pkt = pkt_stream_get_next_tx_pkt(pkt_stream);
-			}
-		}
-
-		if (pkt && pkt->valid) {
-			valid_pkts++;
-			valid_frags += nb_frags;
-		}
-	}
-
-	pthread_mutex_lock(&pacing_mutex);
-	pkts_in_flight += valid_pkts;
-	pthread_mutex_unlock(&pacing_mutex);
-
-	xsk_ring_prod__submit(&xsk->tx, i);
-	xsk->outstanding_tx += valid_frags;
-
-	if (use_poll) {
-		ret = poll(&fds, 1, POLL_TMOUT);
-		if (ret <= 0) {
-			if (ret == 0 && timeout)
-				return TEST_PASS;
-
-			ksft_print_msg("ERROR: [%s] Poll error %d\n", __func__, ret);
-			return TEST_FAILURE;
-		}
-	}
-
-	if (!timeout) {
-		if (complete_pkts(xsk, i))
-			return TEST_FAILURE;
-
-		usleep(10);
-		return TEST_PASS;
-	}
-
-	return TEST_CONTINUE;
-}
-
-static int wait_for_tx_completion(struct xsk_socket_info *xsk)
-{
-	struct timeval tv_end, tv_now, tv_timeout = {THREAD_TMOUT, 0};
-	int ret;
-
-	ret = gettimeofday(&tv_now, NULL);
-	if (ret)
-		exit_with_error(errno);
-	timeradd(&tv_now, &tv_timeout, &tv_end);
-
-	while (xsk->outstanding_tx) {
-		ret = gettimeofday(&tv_now, NULL);
-		if (ret)
-			exit_with_error(errno);
-		if (timercmp(&tv_now, &tv_end, >)) {
-			ksft_print_msg("ERROR: [%s] Transmission loop timed out\n", __func__);
-			return TEST_FAILURE;
-		}
-
-		complete_pkts(xsk, xsk->batch_size);
-	}
-
-	return TEST_PASS;
-}
-
-bool all_packets_sent(struct test_spec *test, unsigned long *bitmap)
-{
-	return bitmap_full(bitmap, test->nb_sockets);
-}
-
-static int send_pkts(struct test_spec *test, struct ifobject *ifobject)
-{
-	bool timeout = !is_umem_valid(test->ifobj_rx);
-	DECLARE_BITMAP(bitmap, test->nb_sockets);
-	u32 i, ret;
-
-	while (!(all_packets_sent(test, bitmap))) {
-		for (i = 0; i < test->nb_sockets; i++) {
-			struct pkt_stream *pkt_stream;
-
-			pkt_stream = ifobject->xsk_arr[i].pkt_stream;
-			if (!pkt_stream || pkt_stream->current_pkt_nb >= pkt_stream->nb_pkts) {
-				__set_bit(i, bitmap);
-				continue;
-			}
-			ret = __send_pkts(ifobject, &ifobject->xsk_arr[i], timeout);
-			if (ret == TEST_CONTINUE && !test->fail)
-				continue;
-
-			if ((ret || test->fail) && !timeout)
-				return TEST_FAILURE;
-
-			if (ret == TEST_PASS && timeout)
-				return ret;
-
-			ret = wait_for_tx_completion(&ifobject->xsk_arr[i]);
-			if (ret)
-				return TEST_FAILURE;
-		}
-	}
-
-	return TEST_PASS;
-}
-
-static int get_xsk_stats(struct xsk_socket *xsk, struct xdp_statistics *stats)
-{
-	int fd = xsk_socket__fd(xsk), err;
-	socklen_t optlen, expected_len;
-
-	optlen = sizeof(*stats);
-	err = getsockopt(fd, SOL_XDP, XDP_STATISTICS, stats, &optlen);
-	if (err) {
-		ksft_print_msg("[%s] getsockopt(XDP_STATISTICS) error %u %s\n",
-			       __func__, -err, strerror(-err));
-		return TEST_FAILURE;
-	}
-
-	expected_len = sizeof(struct xdp_statistics);
-	if (optlen != expected_len) {
-		ksft_print_msg("[%s] getsockopt optlen error. Expected: %u got: %u\n",
-			       __func__, expected_len, optlen);
-		return TEST_FAILURE;
-	}
-
-	return TEST_PASS;
-}
-
-static int validate_rx_dropped(struct ifobject *ifobject)
-{
-	struct xsk_socket *xsk = ifobject->xsk->xsk;
-	struct xdp_statistics stats;
-	int err;
-
-	err = kick_rx(ifobject->xsk);
-	if (err)
-		return TEST_FAILURE;
-
-	err = get_xsk_stats(xsk, &stats);
-	if (err)
-		return TEST_FAILURE;
-
-	/* The receiver calls getsockopt after receiving the last (valid)
-	 * packet which is not the final packet sent in this test (valid and
-	 * invalid packets are sent in alternating fashion with the final
-	 * packet being invalid). Since the last packet may or may not have
-	 * been dropped already, both outcomes must be allowed.
-	 */
-	if (stats.rx_dropped == ifobject->xsk->pkt_stream->nb_pkts / 2 ||
-	    stats.rx_dropped == ifobject->xsk->pkt_stream->nb_pkts / 2 - 1)
-		return TEST_PASS;
-
-	return TEST_FAILURE;
-}
-
-static int validate_rx_full(struct ifobject *ifobject)
-{
-	struct xsk_socket *xsk = ifobject->xsk->xsk;
-	struct xdp_statistics stats;
-	int err;
-
-	usleep(1000);
-	err = kick_rx(ifobject->xsk);
-	if (err)
-		return TEST_FAILURE;
-
-	err = get_xsk_stats(xsk, &stats);
-	if (err)
-		return TEST_FAILURE;
-
-	if (stats.rx_ring_full)
-		return TEST_PASS;
-
-	return TEST_FAILURE;
-}
-
-static int validate_fill_empty(struct ifobject *ifobject)
-{
-	struct xsk_socket *xsk = ifobject->xsk->xsk;
-	struct xdp_statistics stats;
-	int err;
-
-	usleep(1000);
-	err = kick_rx(ifobject->xsk);
-	if (err)
-		return TEST_FAILURE;
-
-	err = get_xsk_stats(xsk, &stats);
-	if (err)
-		return TEST_FAILURE;
-
-	if (stats.rx_fill_ring_empty_descs)
-		return TEST_PASS;
-
-	return TEST_FAILURE;
-}
-
-static int validate_tx_invalid_descs(struct ifobject *ifobject)
-{
-	struct xsk_socket *xsk = ifobject->xsk->xsk;
-	int fd = xsk_socket__fd(xsk);
-	struct xdp_statistics stats;
-	socklen_t optlen;
-	int err;
-
-	optlen = sizeof(stats);
-	err = getsockopt(fd, SOL_XDP, XDP_STATISTICS, &stats, &optlen);
-	if (err) {
-		ksft_print_msg("[%s] getsockopt(XDP_STATISTICS) error %u %s\n",
-			       __func__, -err, strerror(-err));
-		return TEST_FAILURE;
-	}
-
-	if (stats.tx_invalid_descs != ifobject->xsk->pkt_stream->nb_pkts / 2) {
-		ksft_print_msg("[%s] tx_invalid_descs incorrect. Got [%llu] expected [%u]\n",
-			       __func__,
-			       (unsigned long long)stats.tx_invalid_descs,
-			       ifobject->xsk->pkt_stream->nb_pkts);
-		return TEST_FAILURE;
-	}
-
-	return TEST_PASS;
-}
-
-static void xsk_configure_socket(struct test_spec *test, struct ifobject *ifobject,
-				 struct xsk_umem_info *umem, bool tx)
-{
-	int i, ret;
-
-	for (i = 0; i < test->nb_sockets; i++) {
-		bool shared = (ifobject->shared_umem && tx) ? true : !!i;
-		u32 ctr = 0;
-
-		while (ctr++ < SOCK_RECONF_CTR) {
-			ret = __xsk_configure_socket(&ifobject->xsk_arr[i], umem,
-						     ifobject, shared);
-			if (!ret)
-				break;
-
-			/* Retry if it fails as xsk_socket__create() is asynchronous */
-			if (ctr >= SOCK_RECONF_CTR)
-				exit_with_error(-ret);
-			usleep(USLEEP_MAX);
-		}
-		if (ifobject->busy_poll)
-			enable_busy_poll(&ifobject->xsk_arr[i]);
-	}
-}
-
-static void thread_common_ops_tx(struct test_spec *test, struct ifobject *ifobject)
-{
-	xsk_configure_socket(test, ifobject, test->ifobj_rx->umem, true);
-	ifobject->xsk = &ifobject->xsk_arr[0];
-	ifobject->xskmap = test->ifobj_rx->xskmap;
-	memcpy(ifobject->umem, test->ifobj_rx->umem, sizeof(struct xsk_umem_info));
-	ifobject->umem->base_addr = 0;
-}
-
-static void xsk_populate_fill_ring(struct xsk_umem_info *umem, struct pkt_stream *pkt_stream,
-				   bool fill_up)
-{
-	u32 rx_frame_size = umem->frame_size - XDP_PACKET_HEADROOM;
-	u32 idx = 0, filled = 0, buffers_to_fill, nb_pkts;
-	int ret;
-
-	if (umem->num_frames < XSK_RING_PROD__DEFAULT_NUM_DESCS)
-		buffers_to_fill = umem->num_frames;
-	else
-		buffers_to_fill = umem->fill_size;
-
-	ret = xsk_ring_prod__reserve(&umem->fq, buffers_to_fill, &idx);
-	if (ret != buffers_to_fill)
-		exit_with_error(ENOSPC);
-
-	while (filled < buffers_to_fill) {
-		struct pkt *pkt = pkt_stream_get_next_rx_pkt(pkt_stream, &nb_pkts);
-		u64 addr;
-		u32 i;
-
-		for (i = 0; i < pkt_nb_frags(rx_frame_size, pkt_stream, pkt); i++) {
-			if (!pkt) {
-				if (!fill_up)
-					break;
-				addr = filled * umem->frame_size + umem->base_addr;
-			} else if (pkt->offset >= 0) {
-				addr = pkt->offset % umem->frame_size + umem_alloc_buffer(umem);
-			} else {
-				addr = pkt->offset + umem_alloc_buffer(umem);
-			}
-
-			*xsk_ring_prod__fill_addr(&umem->fq, idx++) = addr;
-			if (++filled >= buffers_to_fill)
-				break;
-		}
-	}
-	xsk_ring_prod__submit(&umem->fq, filled);
-	xsk_ring_prod__cancel(&umem->fq, buffers_to_fill - filled);
-
-	pkt_stream_reset(pkt_stream);
-	umem_reset_alloc(umem);
-}
-
-static void thread_common_ops(struct test_spec *test, struct ifobject *ifobject)
-{
-	u64 umem_sz = ifobject->umem->num_frames * ifobject->umem->frame_size;
-	int mmap_flags = MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE;
-	LIBBPF_OPTS(bpf_xdp_query_opts, opts);
-	void *bufs;
-	int ret;
-	u32 i;
-
-	if (ifobject->umem->unaligned_mode)
-		mmap_flags |= MAP_HUGETLB | MAP_HUGE_2MB;
-
-	if (ifobject->shared_umem)
-		umem_sz *= 2;
-
-	bufs = mmap(NULL, umem_sz, PROT_READ | PROT_WRITE, mmap_flags, -1, 0);
-	if (bufs == MAP_FAILED)
-		exit_with_error(errno);
-
-	ret = xsk_configure_umem(ifobject, ifobject->umem, bufs, umem_sz);
-	if (ret)
-		exit_with_error(-ret);
-
-	xsk_configure_socket(test, ifobject, ifobject->umem, false);
-
-	ifobject->xsk = &ifobject->xsk_arr[0];
-
-	if (!ifobject->rx_on)
-		return;
-
-	xsk_populate_fill_ring(ifobject->umem, ifobject->xsk->pkt_stream, ifobject->use_fill_ring);
-
-	for (i = 0; i < test->nb_sockets; i++) {
-		ifobject->xsk = &ifobject->xsk_arr[i];
-		ret = xsk_update_xskmap(ifobject->xskmap, ifobject->xsk->xsk, i);
-		if (ret)
-			exit_with_error(errno);
-	}
-}
-
-static void *worker_testapp_validate_tx(void *arg)
-{
-	struct test_spec *test = (struct test_spec *)arg;
-	struct ifobject *ifobject = test->ifobj_tx;
-	int err;
-
-	if (test->current_step == 1) {
-		if (!ifobject->shared_umem)
-			thread_common_ops(test, ifobject);
-		else
-			thread_common_ops_tx(test, ifobject);
-	}
-
-	err = send_pkts(test, ifobject);
-
-	if (!err && ifobject->validation_func)
-		err = ifobject->validation_func(ifobject);
-	if (err)
-		report_failure(test);
-
-	pthread_exit(NULL);
-}
-
-static void *worker_testapp_validate_rx(void *arg)
-{
-	struct test_spec *test = (struct test_spec *)arg;
-	struct ifobject *ifobject = test->ifobj_rx;
-	int err;
-
-	if (test->current_step == 1) {
-		thread_common_ops(test, ifobject);
-	} else {
-		xsk_clear_xskmap(ifobject->xskmap);
-		err = xsk_update_xskmap(ifobject->xskmap, ifobject->xsk->xsk, 0);
-		if (err) {
-			ksft_print_msg("Error: Failed to update xskmap, error %s\n",
-				       strerror(-err));
-			exit_with_error(-err);
-		}
-	}
-
-	pthread_barrier_wait(&barr);
-
-	err = receive_pkts(test);
-
-	if (!err && ifobject->validation_func)
-		err = ifobject->validation_func(ifobject);
-
-	if (err) {
-		if (test->adjust_tail && !is_adjust_tail_supported(ifobject->xdp_progs))
-			test->adjust_tail_support = false;
-		else
-			report_failure(test);
-	}
-
-	pthread_exit(NULL);
-}
-
-static u64 ceil_u64(u64 a, u64 b)
-{
-	return (a + b - 1) / b;
-}
-
-static void testapp_clean_xsk_umem(struct ifobject *ifobj)
-{
-	u64 umem_sz = ifobj->umem->num_frames * ifobj->umem->frame_size;
-
-	if (ifobj->shared_umem)
-		umem_sz *= 2;
-
-	umem_sz = ceil_u64(umem_sz, HUGEPAGE_SIZE) * HUGEPAGE_SIZE;
-	xsk_umem__delete(ifobj->umem->umem);
-	munmap(ifobj->umem->buffer, umem_sz);
-}
-
-static void handler(int signum)
-{
-	pthread_exit(NULL);
-}
-
-static bool xdp_prog_changed_rx(struct test_spec *test)
-{
-	struct ifobject *ifobj = test->ifobj_rx;
-
-	return ifobj->xdp_prog != test->xdp_prog_rx || ifobj->mode != test->mode;
-}
-
-static bool xdp_prog_changed_tx(struct test_spec *test)
-{
-	struct ifobject *ifobj = test->ifobj_tx;
-
-	return ifobj->xdp_prog != test->xdp_prog_tx || ifobj->mode != test->mode;
-}
-
-static void xsk_reattach_xdp(struct ifobject *ifobj, struct bpf_program *xdp_prog,
-			     struct bpf_map *xskmap, enum test_mode mode)
-{
-	int err;
-
-	xsk_detach_xdp_program(ifobj->ifindex, mode_to_xdp_flags(ifobj->mode));
-	err = xsk_attach_xdp_program(xdp_prog, ifobj->ifindex, mode_to_xdp_flags(mode));
-	if (err) {
-		ksft_print_msg("Error attaching XDP program\n");
-		exit_with_error(-err);
-	}
-
-	if (ifobj->mode != mode && (mode == TEST_MODE_DRV || mode == TEST_MODE_ZC))
-		if (!xsk_is_in_mode(ifobj->ifindex, XDP_FLAGS_DRV_MODE)) {
-			ksft_print_msg("ERROR: XDP prog not in DRV mode\n");
-			exit_with_error(EINVAL);
-		}
-
-	ifobj->xdp_prog = xdp_prog;
-	ifobj->xskmap = xskmap;
-	ifobj->mode = mode;
-}
-
-static void xsk_attach_xdp_progs(struct test_spec *test, struct ifobject *ifobj_rx,
-				 struct ifobject *ifobj_tx)
-{
-	if (xdp_prog_changed_rx(test))
-		xsk_reattach_xdp(ifobj_rx, test->xdp_prog_rx, test->xskmap_rx, test->mode);
-
-	if (!ifobj_tx || ifobj_tx->shared_umem)
-		return;
-
-	if (xdp_prog_changed_tx(test))
-		xsk_reattach_xdp(ifobj_tx, test->xdp_prog_tx, test->xskmap_tx, test->mode);
-}
-
-static int __testapp_validate_traffic(struct test_spec *test, struct ifobject *ifobj1,
-				      struct ifobject *ifobj2)
-{
-	pthread_t t0, t1;
-	int err;
-
-	if (test->mtu > MAX_ETH_PKT_SIZE) {
-		if (test->mode == TEST_MODE_ZC && (!ifobj1->multi_buff_zc_supp ||
-						   (ifobj2 && !ifobj2->multi_buff_zc_supp))) {
-			ksft_test_result_skip("Multi buffer for zero-copy not supported.\n");
-			return TEST_SKIP;
-		}
-		if (test->mode != TEST_MODE_ZC && (!ifobj1->multi_buff_supp ||
-						   (ifobj2 && !ifobj2->multi_buff_supp))) {
-			ksft_test_result_skip("Multi buffer not supported.\n");
-			return TEST_SKIP;
-		}
-	}
-	err = test_spec_set_mtu(test, test->mtu);
-	if (err) {
-		ksft_print_msg("Error, could not set mtu.\n");
-		exit_with_error(err);
-	}
-
-	if (ifobj2) {
-		if (pthread_barrier_init(&barr, NULL, 2))
-			exit_with_error(errno);
-		pkt_stream_reset(ifobj2->xsk->pkt_stream);
-	}
-
-	test->current_step++;
-	pkt_stream_reset(ifobj1->xsk->pkt_stream);
-	pkts_in_flight = 0;
-
-	signal(SIGUSR1, handler);
-	/*Spawn RX thread */
-	pthread_create(&t0, NULL, ifobj1->func_ptr, test);
-
-	if (ifobj2) {
-		pthread_barrier_wait(&barr);
-		if (pthread_barrier_destroy(&barr))
-			exit_with_error(errno);
-
-		/*Spawn TX thread */
-		pthread_create(&t1, NULL, ifobj2->func_ptr, test);
-
-		pthread_join(t1, NULL);
-	}
-
-	if (!ifobj2)
-		pthread_kill(t0, SIGUSR1);
-	else
-		pthread_join(t0, NULL);
-
-	if (test->total_steps == test->current_step || test->fail) {
-		u32 i;
-
-		if (ifobj2)
-			for (i = 0; i < test->nb_sockets; i++)
-				xsk_socket__delete(ifobj2->xsk_arr[i].xsk);
-
-		for (i = 0; i < test->nb_sockets; i++)
-			xsk_socket__delete(ifobj1->xsk_arr[i].xsk);
-
-		testapp_clean_xsk_umem(ifobj1);
-		if (ifobj2 && !ifobj2->shared_umem)
-			testapp_clean_xsk_umem(ifobj2);
-	}
-
-	return !!test->fail;
-}
-
-static int testapp_validate_traffic(struct test_spec *test)
-{
-	struct ifobject *ifobj_rx = test->ifobj_rx;
-	struct ifobject *ifobj_tx = test->ifobj_tx;
-
-	if ((ifobj_rx->umem->unaligned_mode && !ifobj_rx->unaligned_supp) ||
-	    (ifobj_tx->umem->unaligned_mode && !ifobj_tx->unaligned_supp)) {
-		ksft_test_result_skip("No huge pages present.\n");
-		return TEST_SKIP;
-	}
-
-	if (test->set_ring) {
-		if (ifobj_tx->hw_ring_size_supp) {
-			if (set_ring_size(ifobj_tx)) {
-				ksft_test_result_skip("Failed to change HW ring size.\n");
-				return TEST_FAILURE;
-			}
-		} else {
-			ksft_test_result_skip("Changing HW ring size not supported.\n");
-			return TEST_SKIP;
-		}
-	}
-
-	xsk_attach_xdp_progs(test, ifobj_rx, ifobj_tx);
-	return __testapp_validate_traffic(test, ifobj_rx, ifobj_tx);
-}
-
-static int testapp_validate_traffic_single_thread(struct test_spec *test, struct ifobject *ifobj)
-{
-	return __testapp_validate_traffic(test, ifobj, NULL);
-}
-
-static int testapp_teardown(struct test_spec *test)
-{
-	int i;
-
-	for (i = 0; i < MAX_TEARDOWN_ITER; i++) {
-		if (testapp_validate_traffic(test))
-			return TEST_FAILURE;
-		test_spec_reset(test);
-	}
-
-	return TEST_PASS;
-}
-
-static void swap_directions(struct ifobject **ifobj1, struct ifobject **ifobj2)
-{
-	thread_func_t tmp_func_ptr = (*ifobj1)->func_ptr;
-	struct ifobject *tmp_ifobj = (*ifobj1);
-
-	(*ifobj1)->func_ptr = (*ifobj2)->func_ptr;
-	(*ifobj2)->func_ptr = tmp_func_ptr;
-
-	*ifobj1 = *ifobj2;
-	*ifobj2 = tmp_ifobj;
-}
-
-static int testapp_bidirectional(struct test_spec *test)
-{
-	int res;
-
-	test->ifobj_tx->rx_on = true;
-	test->ifobj_rx->tx_on = true;
-	test->total_steps = 2;
-	if (testapp_validate_traffic(test))
-		return TEST_FAILURE;
-
-	print_verbose("Switching Tx/Rx direction\n");
-	swap_directions(&test->ifobj_rx, &test->ifobj_tx);
-	res = __testapp_validate_traffic(test, test->ifobj_rx, test->ifobj_tx);
-
-	swap_directions(&test->ifobj_rx, &test->ifobj_tx);
-	return res;
-}
-
-static int swap_xsk_resources(struct test_spec *test)
-{
-	int ret;
-
-	test->ifobj_tx->xsk_arr[0].pkt_stream = NULL;
-	test->ifobj_rx->xsk_arr[0].pkt_stream = NULL;
-	test->ifobj_tx->xsk_arr[1].pkt_stream = test->tx_pkt_stream_default;
-	test->ifobj_rx->xsk_arr[1].pkt_stream = test->rx_pkt_stream_default;
-	test->ifobj_tx->xsk = &test->ifobj_tx->xsk_arr[1];
-	test->ifobj_rx->xsk = &test->ifobj_rx->xsk_arr[1];
-
-	ret = xsk_update_xskmap(test->ifobj_rx->xskmap, test->ifobj_rx->xsk->xsk, 0);
-	if (ret)
-		return TEST_FAILURE;
-
-	return TEST_PASS;
-}
-
-static int testapp_xdp_prog_cleanup(struct test_spec *test)
-{
-	test->total_steps = 2;
-	test->nb_sockets = 2;
-	if (testapp_validate_traffic(test))
-		return TEST_FAILURE;
-
-	if (swap_xsk_resources(test))
-		return TEST_FAILURE;
-	return testapp_validate_traffic(test);
-}
-
-static int testapp_headroom(struct test_spec *test)
-{
-	test->ifobj_rx->umem->frame_headroom = UMEM_HEADROOM_TEST_SIZE;
-	return testapp_validate_traffic(test);
-}
-
-static int testapp_stats_rx_dropped(struct test_spec *test)
-{
-	if (test->mode == TEST_MODE_ZC) {
-		ksft_test_result_skip("Can not run RX_DROPPED test for ZC mode\n");
-		return TEST_SKIP;
-	}
-
-	pkt_stream_replace_half(test, MIN_PKT_SIZE * 4, 0);
-	test->ifobj_rx->umem->frame_headroom = test->ifobj_rx->umem->frame_size -
-		XDP_PACKET_HEADROOM - MIN_PKT_SIZE * 3;
-	pkt_stream_receive_half(test);
-	test->ifobj_rx->validation_func = validate_rx_dropped;
-	return testapp_validate_traffic(test);
-}
-
-static int testapp_stats_tx_invalid_descs(struct test_spec *test)
-{
-	pkt_stream_replace_half(test, XSK_UMEM__INVALID_FRAME_SIZE, 0);
-	test->ifobj_tx->validation_func = validate_tx_invalid_descs;
-	return testapp_validate_traffic(test);
-}
-
-static int testapp_stats_rx_full(struct test_spec *test)
-{
-	pkt_stream_replace(test, DEFAULT_UMEM_BUFFERS + DEFAULT_UMEM_BUFFERS / 2, MIN_PKT_SIZE);
-	test->ifobj_rx->xsk->pkt_stream = pkt_stream_generate(DEFAULT_UMEM_BUFFERS, MIN_PKT_SIZE);
-
-	test->ifobj_rx->xsk->rxqsize = DEFAULT_UMEM_BUFFERS;
-	test->ifobj_rx->release_rx = false;
-	test->ifobj_rx->validation_func = validate_rx_full;
-	return testapp_validate_traffic(test);
-}
-
-static int testapp_stats_fill_empty(struct test_spec *test)
-{
-	pkt_stream_replace(test, DEFAULT_UMEM_BUFFERS + DEFAULT_UMEM_BUFFERS / 2, MIN_PKT_SIZE);
-	test->ifobj_rx->xsk->pkt_stream = pkt_stream_generate(DEFAULT_UMEM_BUFFERS, MIN_PKT_SIZE);
-
-	test->ifobj_rx->use_fill_ring = false;
-	test->ifobj_rx->validation_func = validate_fill_empty;
-	return testapp_validate_traffic(test);
-}
-
-static int testapp_send_receive_unaligned(struct test_spec *test)
-{
-	test->ifobj_tx->umem->unaligned_mode = true;
-	test->ifobj_rx->umem->unaligned_mode = true;
-	/* Let half of the packets straddle a 4K buffer boundary */
-	pkt_stream_replace_half(test, MIN_PKT_SIZE, -MIN_PKT_SIZE / 2);
-
-	return testapp_validate_traffic(test);
-}
-
-static int testapp_send_receive_unaligned_mb(struct test_spec *test)
-{
-	test->mtu = MAX_ETH_JUMBO_SIZE;
-	test->ifobj_tx->umem->unaligned_mode = true;
-	test->ifobj_rx->umem->unaligned_mode = true;
-	pkt_stream_replace(test, DEFAULT_PKT_CNT, MAX_ETH_JUMBO_SIZE);
-	return testapp_validate_traffic(test);
-}
-
-static int testapp_single_pkt(struct test_spec *test)
-{
-	struct pkt pkts[] = {{0, MIN_PKT_SIZE, 0, true}};
-
-	pkt_stream_generate_custom(test, pkts, ARRAY_SIZE(pkts));
-	return testapp_validate_traffic(test);
-}
-
-static int testapp_send_receive_mb(struct test_spec *test)
-{
-	test->mtu = MAX_ETH_JUMBO_SIZE;
-	pkt_stream_replace(test, DEFAULT_PKT_CNT, MAX_ETH_JUMBO_SIZE);
-
-	return testapp_validate_traffic(test);
-}
-
-static int testapp_invalid_desc_mb(struct test_spec *test)
-{
-	struct xsk_umem_info *umem = test->ifobj_tx->umem;
-	u64 umem_size = umem->num_frames * umem->frame_size;
-	struct pkt pkts[] = {
-		/* Valid packet for synch to start with */
-		{0, MIN_PKT_SIZE, 0, true, 0},
-		/* Zero frame len is not legal */
-		{0, XSK_UMEM__LARGE_FRAME_SIZE, 0, false, XDP_PKT_CONTD},
-		{0, XSK_UMEM__LARGE_FRAME_SIZE, 0, false, XDP_PKT_CONTD},
-		{0, 0, 0, false, 0},
-		/* Invalid address in the second frame */
-		{0, XSK_UMEM__LARGE_FRAME_SIZE, 0, false, XDP_PKT_CONTD},
-		{umem_size, XSK_UMEM__LARGE_FRAME_SIZE, 0, false, XDP_PKT_CONTD},
-		/* Invalid len in the middle */
-		{0, XSK_UMEM__LARGE_FRAME_SIZE, 0, false, XDP_PKT_CONTD},
-		{0, XSK_UMEM__INVALID_FRAME_SIZE, 0, false, XDP_PKT_CONTD},
-		/* Invalid options in the middle */
-		{0, XSK_UMEM__LARGE_FRAME_SIZE, 0, false, XDP_PKT_CONTD},
-		{0, XSK_UMEM__LARGE_FRAME_SIZE, 0, false, XSK_DESC__INVALID_OPTION},
-		/* Transmit 2 frags, receive 3 */
-		{0, XSK_UMEM__MAX_FRAME_SIZE, 0, true, XDP_PKT_CONTD},
-		{0, XSK_UMEM__MAX_FRAME_SIZE, 0, true, 0},
-		/* Middle frame crosses chunk boundary with small length */
-		{0, XSK_UMEM__LARGE_FRAME_SIZE, 0, false, XDP_PKT_CONTD},
-		{-MIN_PKT_SIZE / 2, MIN_PKT_SIZE, 0, false, 0},
-		/* Valid packet for synch so that something is received */
-		{0, MIN_PKT_SIZE, 0, true, 0}};
-
-	if (umem->unaligned_mode) {
-		/* Crossing a chunk boundary allowed */
-		pkts[12].valid = true;
-		pkts[13].valid = true;
-	}
-
-	test->mtu = MAX_ETH_JUMBO_SIZE;
-	pkt_stream_generate_custom(test, pkts, ARRAY_SIZE(pkts));
-	return testapp_validate_traffic(test);
-}
-
-static int testapp_invalid_desc(struct test_spec *test)
-{
-	struct xsk_umem_info *umem = test->ifobj_tx->umem;
-	u64 umem_size = umem->num_frames * umem->frame_size;
-	struct pkt pkts[] = {
-		/* Zero packet address allowed */
-		{0, MIN_PKT_SIZE, 0, true},
-		/* Allowed packet */
-		{0, MIN_PKT_SIZE, 0, true},
-		/* Straddling the start of umem */
-		{-2, MIN_PKT_SIZE, 0, false},
-		/* Packet too large */
-		{0, XSK_UMEM__INVALID_FRAME_SIZE, 0, false},
-		/* Up to end of umem allowed */
-		{umem_size - MIN_PKT_SIZE - 2 * umem->frame_size, MIN_PKT_SIZE, 0, true},
-		/* After umem ends */
-		{umem_size, MIN_PKT_SIZE, 0, false},
-		/* Straddle the end of umem */
-		{umem_size - MIN_PKT_SIZE / 2, MIN_PKT_SIZE, 0, false},
-		/* Straddle a 4K boundary */
-		{0x1000 - MIN_PKT_SIZE / 2, MIN_PKT_SIZE, 0, false},
-		/* Straddle a 2K boundary */
-		{0x800 - MIN_PKT_SIZE / 2, MIN_PKT_SIZE, 0, true},
-		/* Valid packet for synch so that something is received */
-		{0, MIN_PKT_SIZE, 0, true}};
-
-	if (umem->unaligned_mode) {
-		/* Crossing a page boundary allowed */
-		pkts[7].valid = true;
-	}
-	if (umem->frame_size == XSK_UMEM__DEFAULT_FRAME_SIZE / 2) {
-		/* Crossing a 2K frame size boundary not allowed */
-		pkts[8].valid = false;
-	}
-
-	if (test->ifobj_tx->shared_umem) {
-		pkts[4].offset += umem_size;
-		pkts[5].offset += umem_size;
-		pkts[6].offset += umem_size;
-	}
-
-	pkt_stream_generate_custom(test, pkts, ARRAY_SIZE(pkts));
-	return testapp_validate_traffic(test);
-}
-
-static int testapp_xdp_drop(struct test_spec *test)
-{
-	struct xsk_xdp_progs *skel_rx = test->ifobj_rx->xdp_progs;
-	struct xsk_xdp_progs *skel_tx = test->ifobj_tx->xdp_progs;
-
-	test_spec_set_xdp_prog(test, skel_rx->progs.xsk_xdp_drop, skel_tx->progs.xsk_xdp_drop,
-			       skel_rx->maps.xsk, skel_tx->maps.xsk);
-
-	pkt_stream_receive_half(test);
-	return testapp_validate_traffic(test);
-}
-
-static int testapp_xdp_metadata_copy(struct test_spec *test)
-{
-	struct xsk_xdp_progs *skel_rx = test->ifobj_rx->xdp_progs;
-	struct xsk_xdp_progs *skel_tx = test->ifobj_tx->xdp_progs;
-
-	test_spec_set_xdp_prog(test, skel_rx->progs.xsk_xdp_populate_metadata,
-			       skel_tx->progs.xsk_xdp_populate_metadata,
-			       skel_rx->maps.xsk, skel_tx->maps.xsk);
-	test->ifobj_rx->use_metadata = true;
-
-	skel_rx->bss->count = 0;
-
-	return testapp_validate_traffic(test);
-}
-
-static int testapp_xdp_shared_umem(struct test_spec *test)
-{
-	struct xsk_xdp_progs *skel_rx = test->ifobj_rx->xdp_progs;
-	struct xsk_xdp_progs *skel_tx = test->ifobj_tx->xdp_progs;
-
-	test->total_steps = 1;
-	test->nb_sockets = 2;
-
-	test_spec_set_xdp_prog(test, skel_rx->progs.xsk_xdp_shared_umem,
-			       skel_tx->progs.xsk_xdp_shared_umem,
-			       skel_rx->maps.xsk, skel_tx->maps.xsk);
-
-	pkt_stream_even_odd_sequence(test);
-
-	return testapp_validate_traffic(test);
-}
-
-static int testapp_poll_txq_tmout(struct test_spec *test)
-{
-	test->ifobj_tx->use_poll = true;
-	/* create invalid frame by set umem frame_size and pkt length equal to 2048 */
-	test->ifobj_tx->umem->frame_size = 2048;
-	pkt_stream_replace(test, 2 * DEFAULT_PKT_CNT, 2048);
-	return testapp_validate_traffic_single_thread(test, test->ifobj_tx);
-}
-
-static int testapp_poll_rxq_tmout(struct test_spec *test)
-{
-	test->ifobj_rx->use_poll = true;
-	return testapp_validate_traffic_single_thread(test, test->ifobj_rx);
-}
-
-static int testapp_too_many_frags(struct test_spec *test)
-{
-	struct pkt *pkts;
-	u32 max_frags, i;
-	int ret;
-
-	if (test->mode == TEST_MODE_ZC) {
-		max_frags = test->ifobj_tx->xdp_zc_max_segs;
-	} else {
-		max_frags = get_max_skb_frags();
-		if (!max_frags) {
-			ksft_print_msg("Couldn't retrieve MAX_SKB_FRAGS from system, using default (17) value\n");
-			max_frags = 17;
-		}
-		max_frags += 1;
-	}
-
-	pkts = calloc(2 * max_frags + 2, sizeof(struct pkt));
-	if (!pkts)
-		return TEST_FAILURE;
-
-	test->mtu = MAX_ETH_JUMBO_SIZE;
-
-	/* Valid packet for synch */
-	pkts[0].len = MIN_PKT_SIZE;
-	pkts[0].valid = true;
-
-	/* One valid packet with the max amount of frags */
-	for (i = 1; i < max_frags + 1; i++) {
-		pkts[i].len = MIN_PKT_SIZE;
-		pkts[i].options = XDP_PKT_CONTD;
-		pkts[i].valid = true;
-	}
-	pkts[max_frags].options = 0;
-
-	/* An invalid packet with the max amount of frags but signals packet
-	 * continues on the last frag
-	 */
-	for (i = max_frags + 1; i < 2 * max_frags + 1; i++) {
-		pkts[i].len = MIN_PKT_SIZE;
-		pkts[i].options = XDP_PKT_CONTD;
-		pkts[i].valid = false;
-	}
-
-	/* Valid packet for synch */
-	pkts[2 * max_frags + 1].len = MIN_PKT_SIZE;
-	pkts[2 * max_frags + 1].valid = true;
-
-	pkt_stream_generate_custom(test, pkts, 2 * max_frags + 2);
-	ret = testapp_validate_traffic(test);
-
-	free(pkts);
-	return ret;
-}
-
-static int xsk_load_xdp_programs(struct ifobject *ifobj)
-{
-	ifobj->xdp_progs = xsk_xdp_progs__open_and_load();
-	if (libbpf_get_error(ifobj->xdp_progs))
-		return libbpf_get_error(ifobj->xdp_progs);
-
-	return 0;
-}
-
-static void xsk_unload_xdp_programs(struct ifobject *ifobj)
-{
-	xsk_xdp_progs__destroy(ifobj->xdp_progs);
-}
-
-/* Simple test */
-static bool hugepages_present(void)
-{
-	size_t mmap_sz = 2 * DEFAULT_UMEM_BUFFERS * XSK_UMEM__DEFAULT_FRAME_SIZE;
-	void *bufs;
-
-	bufs = mmap(NULL, mmap_sz, PROT_READ | PROT_WRITE,
-		    MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, -1, MAP_HUGE_2MB);
-	if (bufs == MAP_FAILED)
-		return false;
-
-	mmap_sz = ceil_u64(mmap_sz, HUGEPAGE_SIZE) * HUGEPAGE_SIZE;
-	munmap(bufs, mmap_sz);
-	return true;
-}
-
-static void init_iface(struct ifobject *ifobj, thread_func_t func_ptr)
-{
-	LIBBPF_OPTS(bpf_xdp_query_opts, query_opts);
-	int err;
-
-	ifobj->func_ptr = func_ptr;
-
-	err = xsk_load_xdp_programs(ifobj);
-	if (err) {
-		ksft_print_msg("Error loading XDP program\n");
-		exit_with_error(err);
-	}
-
-	if (hugepages_present())
-		ifobj->unaligned_supp = true;
-
-	err = bpf_xdp_query(ifobj->ifindex, XDP_FLAGS_DRV_MODE, &query_opts);
-	if (err) {
-		ksft_print_msg("Error querying XDP capabilities\n");
-		exit_with_error(-err);
-	}
-	if (query_opts.feature_flags & NETDEV_XDP_ACT_RX_SG)
-		ifobj->multi_buff_supp = true;
-	if (query_opts.feature_flags & NETDEV_XDP_ACT_XSK_ZEROCOPY) {
-		if (query_opts.xdp_zc_max_segs > 1) {
-			ifobj->multi_buff_zc_supp = true;
-			ifobj->xdp_zc_max_segs = query_opts.xdp_zc_max_segs;
-		} else {
-			ifobj->xdp_zc_max_segs = 0;
-		}
-	}
-}
-
-static int testapp_send_receive(struct test_spec *test)
-{
-	return testapp_validate_traffic(test);
-}
-
-static int testapp_send_receive_2k_frame(struct test_spec *test)
-{
-	test->ifobj_tx->umem->frame_size = 2048;
-	test->ifobj_rx->umem->frame_size = 2048;
-	pkt_stream_replace(test, DEFAULT_PKT_CNT, MIN_PKT_SIZE);
-	return testapp_validate_traffic(test);
-}
-
-static int testapp_poll_rx(struct test_spec *test)
-{
-	test->ifobj_rx->use_poll = true;
-	return testapp_validate_traffic(test);
-}
-
-static int testapp_poll_tx(struct test_spec *test)
-{
-	test->ifobj_tx->use_poll = true;
-	return testapp_validate_traffic(test);
-}
-
-static int testapp_aligned_inv_desc(struct test_spec *test)
-{
-	return testapp_invalid_desc(test);
-}
-
-static int testapp_aligned_inv_desc_2k_frame(struct test_spec *test)
-{
-	test->ifobj_tx->umem->frame_size = 2048;
-	test->ifobj_rx->umem->frame_size = 2048;
-	return testapp_invalid_desc(test);
-}
-
-static int testapp_unaligned_inv_desc(struct test_spec *test)
-{
-	test->ifobj_tx->umem->unaligned_mode = true;
-	test->ifobj_rx->umem->unaligned_mode = true;
-	return testapp_invalid_desc(test);
-}
-
-static int testapp_unaligned_inv_desc_4001_frame(struct test_spec *test)
-{
-	u64 page_size, umem_size;
-
-	/* Odd frame size so the UMEM doesn't end near a page boundary. */
-	test->ifobj_tx->umem->frame_size = 4001;
-	test->ifobj_rx->umem->frame_size = 4001;
-	test->ifobj_tx->umem->unaligned_mode = true;
-	test->ifobj_rx->umem->unaligned_mode = true;
-	/* This test exists to test descriptors that staddle the end of
-	 * the UMEM but not a page.
-	 */
-	page_size = sysconf(_SC_PAGESIZE);
-	umem_size = test->ifobj_tx->umem->num_frames * test->ifobj_tx->umem->frame_size;
-	assert(umem_size % page_size > MIN_PKT_SIZE);
-	assert(umem_size % page_size < page_size - MIN_PKT_SIZE);
-
-	return testapp_invalid_desc(test);
-}
-
-static int testapp_aligned_inv_desc_mb(struct test_spec *test)
-{
-	return testapp_invalid_desc_mb(test);
-}
-
-static int testapp_unaligned_inv_desc_mb(struct test_spec *test)
-{
-	test->ifobj_tx->umem->unaligned_mode = true;
-	test->ifobj_rx->umem->unaligned_mode = true;
-	return testapp_invalid_desc_mb(test);
-}
-
-static int testapp_xdp_metadata(struct test_spec *test)
-{
-	return testapp_xdp_metadata_copy(test);
-}
-
-static int testapp_xdp_metadata_mb(struct test_spec *test)
-{
-	test->mtu = MAX_ETH_JUMBO_SIZE;
-	return testapp_xdp_metadata_copy(test);
-}
-
-static int testapp_hw_sw_min_ring_size(struct test_spec *test)
-{
-	int ret;
-
-	test->set_ring = true;
-	test->total_steps = 2;
-	test->ifobj_tx->ring.tx_pending = DEFAULT_BATCH_SIZE;
-	test->ifobj_tx->ring.rx_pending = DEFAULT_BATCH_SIZE * 2;
-	test->ifobj_tx->xsk->batch_size = 1;
-	test->ifobj_rx->xsk->batch_size = 1;
-	ret = testapp_validate_traffic(test);
-	if (ret)
-		return ret;
-
-	/* Set batch size to hw_ring_size - 1 */
-	test->ifobj_tx->xsk->batch_size = DEFAULT_BATCH_SIZE - 1;
-	test->ifobj_rx->xsk->batch_size = DEFAULT_BATCH_SIZE - 1;
-	return testapp_validate_traffic(test);
-}
-
-static int testapp_hw_sw_max_ring_size(struct test_spec *test)
-{
-	u32 max_descs = XSK_RING_PROD__DEFAULT_NUM_DESCS * 4;
-	int ret;
-
-	test->set_ring = true;
-	test->total_steps = 2;
-	test->ifobj_tx->ring.tx_pending = test->ifobj_tx->ring.tx_max_pending;
-	test->ifobj_tx->ring.rx_pending  = test->ifobj_tx->ring.rx_max_pending;
-	test->ifobj_rx->umem->num_frames = max_descs;
-	test->ifobj_rx->umem->fill_size = max_descs;
-	test->ifobj_rx->umem->comp_size = max_descs;
-	test->ifobj_tx->xsk->batch_size = XSK_RING_PROD__DEFAULT_NUM_DESCS;
-	test->ifobj_rx->xsk->batch_size = XSK_RING_PROD__DEFAULT_NUM_DESCS;
-
-	ret = testapp_validate_traffic(test);
-	if (ret)
-		return ret;
-
-	/* Set batch_size to 8152 for testing, as the ice HW ignores the 3 lowest bits when
-	 * updating the Rx HW tail register.
-	 */
-	test->ifobj_tx->xsk->batch_size = test->ifobj_tx->ring.tx_max_pending - 8;
-	test->ifobj_rx->xsk->batch_size = test->ifobj_tx->ring.tx_max_pending - 8;
-	pkt_stream_replace(test, max_descs, MIN_PKT_SIZE);
-	return testapp_validate_traffic(test);
-}
-
-static int testapp_xdp_adjust_tail(struct test_spec *test, int adjust_value)
-{
-	struct xsk_xdp_progs *skel_rx = test->ifobj_rx->xdp_progs;
-	struct xsk_xdp_progs *skel_tx = test->ifobj_tx->xdp_progs;
-
-	test_spec_set_xdp_prog(test, skel_rx->progs.xsk_xdp_adjust_tail,
-			       skel_tx->progs.xsk_xdp_adjust_tail,
-			       skel_rx->maps.xsk, skel_tx->maps.xsk);
-
-	skel_rx->bss->adjust_value = adjust_value;
-
-	return testapp_validate_traffic(test);
-}
-
-static int testapp_adjust_tail(struct test_spec *test, u32 value, u32 pkt_len)
-{
-	int ret;
-
-	test->adjust_tail_support = true;
-	test->adjust_tail = true;
-	test->total_steps = 1;
-
-	pkt_stream_replace_ifobject(test->ifobj_tx, DEFAULT_BATCH_SIZE, pkt_len);
-	pkt_stream_replace_ifobject(test->ifobj_rx, DEFAULT_BATCH_SIZE, pkt_len + value);
-
-	ret = testapp_xdp_adjust_tail(test, value);
-	if (ret)
-		return ret;
-
-	if (!test->adjust_tail_support) {
-		ksft_test_result_skip("%s %sResize pkt with bpf_xdp_adjust_tail() not supported\n",
-				      mode_string(test), busy_poll_string(test));
-		return TEST_SKIP;
-	}
-
-	return 0;
-}
-
-static int testapp_adjust_tail_shrink(struct test_spec *test)
-{
-	/* Shrink by 4 bytes for testing purpose */
-	return testapp_adjust_tail(test, -4, MIN_PKT_SIZE * 2);
-}
-
-static int testapp_adjust_tail_shrink_mb(struct test_spec *test)
-{
-	test->mtu = MAX_ETH_JUMBO_SIZE;
-	/* Shrink by the frag size */
-	return testapp_adjust_tail(test, -XSK_UMEM__MAX_FRAME_SIZE, XSK_UMEM__LARGE_FRAME_SIZE * 2);
-}
-
-static int testapp_adjust_tail_grow(struct test_spec *test)
-{
-	/* Grow by 4 bytes for testing purpose */
-	return testapp_adjust_tail(test, 4, MIN_PKT_SIZE * 2);
-}
-
-static int testapp_adjust_tail_grow_mb(struct test_spec *test)
-{
-	test->mtu = MAX_ETH_JUMBO_SIZE;
-	/* Grow by (frag_size - last_frag_Size) - 1 to stay inside the last fragment */
-	return testapp_adjust_tail(test, (XSK_UMEM__MAX_FRAME_SIZE / 2) - 1,
-				   XSK_UMEM__LARGE_FRAME_SIZE * 2);
-}
-
-static int testapp_tx_queue_consumer(struct test_spec *test)
-{
-	int nr_packets;
-
-	if (test->mode == TEST_MODE_ZC) {
-		ksft_test_result_skip("Can not run TX_QUEUE_CONSUMER test for ZC mode\n");
-		return TEST_SKIP;
-	}
-
-	nr_packets = MAX_TX_BUDGET_DEFAULT + 1;
-	pkt_stream_replace(test, nr_packets, MIN_PKT_SIZE);
-	test->ifobj_tx->xsk->batch_size = nr_packets;
-	test->ifobj_tx->xsk->check_consumer = true;
-
-	return testapp_validate_traffic(test);
-}
-
-static void run_pkt_test(struct test_spec *test)
-{
-	int ret;
-
-	ret = test->test_func(test);
-
-	if (ret == TEST_PASS)
-		ksft_test_result_pass("PASS: %s %s%s\n", mode_string(test), busy_poll_string(test),
-				      test->name);
-	pkt_stream_restore_default(test);
-}
-
-static struct ifobject *ifobject_create(void)
-{
-	struct ifobject *ifobj;
-
-	ifobj = calloc(1, sizeof(struct ifobject));
-	if (!ifobj)
-		return NULL;
-
-	ifobj->xsk_arr = calloc(MAX_SOCKETS, sizeof(*ifobj->xsk_arr));
-	if (!ifobj->xsk_arr)
-		goto out_xsk_arr;
-
-	ifobj->umem = calloc(1, sizeof(*ifobj->umem));
-	if (!ifobj->umem)
-		goto out_umem;
-
-	return ifobj;
-
-out_umem:
-	free(ifobj->xsk_arr);
-out_xsk_arr:
-	free(ifobj);
-	return NULL;
-}
-
-static void ifobject_delete(struct ifobject *ifobj)
-{
-	free(ifobj->umem);
-	free(ifobj->xsk_arr);
-	free(ifobj);
-}
-
-static bool is_xdp_supported(int ifindex)
-{
-	int flags = XDP_FLAGS_DRV_MODE;
-
-	LIBBPF_OPTS(bpf_link_create_opts, opts, .flags = flags);
-	struct bpf_insn insns[2] = {
-		BPF_MOV64_IMM(BPF_REG_0, XDP_PASS),
-		BPF_EXIT_INSN()
-	};
-	int prog_fd, insn_cnt = ARRAY_SIZE(insns);
-	int err;
-
-	prog_fd = bpf_prog_load(BPF_PROG_TYPE_XDP, NULL, "GPL", insns, insn_cnt, NULL);
-	if (prog_fd < 0)
-		return false;
-
-	err = bpf_xdp_attach(ifindex, prog_fd, flags, NULL);
-	if (err) {
-		close(prog_fd);
-		return false;
-	}
-
-	bpf_xdp_detach(ifindex, flags, NULL);
-	close(prog_fd);
-
-	return true;
-}
-
-static const struct test_spec tests[] = {
-	{.name = "SEND_RECEIVE", .test_func = testapp_send_receive},
-	{.name = "SEND_RECEIVE_2K_FRAME", .test_func = testapp_send_receive_2k_frame},
-	{.name = "SEND_RECEIVE_SINGLE_PKT", .test_func = testapp_single_pkt},
-	{.name = "POLL_RX", .test_func = testapp_poll_rx},
-	{.name = "POLL_TX", .test_func = testapp_poll_tx},
-	{.name = "POLL_RXQ_FULL", .test_func = testapp_poll_rxq_tmout},
-	{.name = "POLL_TXQ_FULL", .test_func = testapp_poll_txq_tmout},
-	{.name = "SEND_RECEIVE_UNALIGNED", .test_func = testapp_send_receive_unaligned},
-	{.name = "ALIGNED_INV_DESC", .test_func = testapp_aligned_inv_desc},
-	{.name = "ALIGNED_INV_DESC_2K_FRAME_SIZE", .test_func = testapp_aligned_inv_desc_2k_frame},
-	{.name = "UNALIGNED_INV_DESC", .test_func = testapp_unaligned_inv_desc},
-	{.name = "UNALIGNED_INV_DESC_4001_FRAME_SIZE",
-	 .test_func = testapp_unaligned_inv_desc_4001_frame},
-	{.name = "UMEM_HEADROOM", .test_func = testapp_headroom},
-	{.name = "TEARDOWN", .test_func = testapp_teardown},
-	{.name = "BIDIRECTIONAL", .test_func = testapp_bidirectional},
-	{.name = "STAT_RX_DROPPED", .test_func = testapp_stats_rx_dropped},
-	{.name = "STAT_TX_INVALID", .test_func = testapp_stats_tx_invalid_descs},
-	{.name = "STAT_RX_FULL", .test_func = testapp_stats_rx_full},
-	{.name = "STAT_FILL_EMPTY", .test_func = testapp_stats_fill_empty},
-	{.name = "XDP_PROG_CLEANUP", .test_func = testapp_xdp_prog_cleanup},
-	{.name = "XDP_DROP_HALF", .test_func = testapp_xdp_drop},
-	{.name = "XDP_SHARED_UMEM", .test_func = testapp_xdp_shared_umem},
-	{.name = "XDP_METADATA_COPY", .test_func = testapp_xdp_metadata},
-	{.name = "XDP_METADATA_COPY_MULTI_BUFF", .test_func = testapp_xdp_metadata_mb},
-	{.name = "SEND_RECEIVE_9K_PACKETS", .test_func = testapp_send_receive_mb},
-	{.name = "SEND_RECEIVE_UNALIGNED_9K_PACKETS",
-	 .test_func = testapp_send_receive_unaligned_mb},
-	{.name = "ALIGNED_INV_DESC_MULTI_BUFF", .test_func = testapp_aligned_inv_desc_mb},
-	{.name = "UNALIGNED_INV_DESC_MULTI_BUFF", .test_func = testapp_unaligned_inv_desc_mb},
-	{.name = "TOO_MANY_FRAGS", .test_func = testapp_too_many_frags},
-	{.name = "HW_SW_MIN_RING_SIZE", .test_func = testapp_hw_sw_min_ring_size},
-	{.name = "HW_SW_MAX_RING_SIZE", .test_func = testapp_hw_sw_max_ring_size},
-	{.name = "XDP_ADJUST_TAIL_SHRINK", .test_func = testapp_adjust_tail_shrink},
-	{.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},
-	{.name = "XDP_ADJUST_TAIL_GROW_MULTI_BUFF", .test_func = testapp_adjust_tail_grow_mb},
-	{.name = "TX_QUEUE_CONSUMER", .test_func = testapp_tx_queue_consumer},
-	};
-
 static void print_tests(void)
 {
 	u32 i;
@@ -2833,7 +376,7 @@ int main(int argc, char **argv)
 	init_iface(ifobj_rx, worker_testapp_validate_rx);
 	init_iface(ifobj_tx, worker_testapp_validate_tx);
 
-	test_spec_init(&test, ifobj_tx, ifobj_rx, 0, &tests[0]);
+	test_init(&test, ifobj_tx, ifobj_rx, 0, &tests[0]);
 	tx_pkt_stream_default = pkt_stream_generate(DEFAULT_PKT_CNT, MIN_PKT_SIZE);
 	rx_pkt_stream_default = pkt_stream_generate(DEFAULT_PKT_CNT, MIN_PKT_SIZE);
 	if (!tx_pkt_stream_default || !rx_pkt_stream_default)
@@ -2868,7 +411,7 @@ int main(int argc, char **argv)
 			if (opt_run_test != RUN_ALL_TESTS && j != opt_run_test)
 				continue;
 
-			test_spec_init(&test, ifobj_tx, ifobj_rx, i, &tests[j]);
+			test_init(&test, ifobj_tx, ifobj_rx, i, &tests[j]);
 			run_pkt_test(&test);
 			usleep(USLEEP_MAX);
 
diff --git a/tools/testing/selftests/bpf/xskxceiver.h b/tools/testing/selftests/bpf/xskxceiver.h
index 4df3a5d329acf..3ca518df23ada 100644
--- a/tools/testing/selftests/bpf/xskxceiver.h
+++ b/tools/testing/selftests/bpf/xskxceiver.h
@@ -22,169 +22,13 @@
 #define PF_XDP AF_XDP
 #endif
 
-#ifndef SO_BUSY_POLL_BUDGET
-#define SO_BUSY_POLL_BUDGET 70
-#endif
-
-#ifndef SO_PREFER_BUSY_POLL
-#define SO_PREFER_BUSY_POLL 69
-#endif
-
-#define TEST_PASS 0
-#define TEST_FAILURE -1
-#define TEST_CONTINUE 1
-#define TEST_SKIP 2
-#define MAX_INTERFACES 2
-#define MAX_INTERFACE_NAME_CHARS 16
-#define MAX_TEST_NAME_SIZE 48
 #define MAX_TEARDOWN_ITER 10
-#define PKT_HDR_SIZE (sizeof(struct ethhdr) + 2) /* Just to align the data in the packet */
-#define MIN_PKT_SIZE 64
-#define MAX_ETH_PKT_SIZE 1518
 #define MAX_ETH_JUMBO_SIZE 9000
-#define USLEEP_MAX 10000
 #define SOCK_RECONF_CTR 10
-#define DEFAULT_BATCH_SIZE 64
-#define POLL_TMOUT 1000
-#define THREAD_TMOUT 3
-#define DEFAULT_PKT_CNT (4 * 1024)
-#define DEFAULT_UMEM_BUFFERS (DEFAULT_PKT_CNT / 4)
 #define RX_FULL_RXQSIZE 32
 #define UMEM_HEADROOM_TEST_SIZE 128
 #define XSK_UMEM__INVALID_FRAME_SIZE (MAX_ETH_JUMBO_SIZE + 1)
-#define XSK_UMEM__LARGE_FRAME_SIZE (3 * 1024)
-#define XSK_UMEM__MAX_FRAME_SIZE (4 * 1024)
-#define XSK_DESC__INVALID_OPTION (0xffff)
-#define HUGEPAGE_SIZE (2 * 1024 * 1024)
-#define PKT_DUMP_NB_TO_PRINT 16
 #define RUN_ALL_TESTS UINT_MAX
 #define NUM_MAC_ADDRESSES 4
 
-#define print_verbose(x...) do { if (opt_verbose) ksft_print_msg(x); } while (0)
-
-enum test_mode {
-	TEST_MODE_SKB,
-	TEST_MODE_DRV,
-	TEST_MODE_ZC,
-	TEST_MODE_ALL
-};
-
-struct xsk_umem_info {
-	struct xsk_ring_prod fq;
-	struct xsk_ring_cons cq;
-	struct xsk_umem *umem;
-	u64 next_buffer;
-	u32 num_frames;
-	u32 frame_headroom;
-	void *buffer;
-	u32 frame_size;
-	u32 base_addr;
-	u32 fill_size;
-	u32 comp_size;
-	bool unaligned_mode;
-};
-
-struct xsk_socket_info {
-	struct xsk_ring_cons rx;
-	struct xsk_ring_prod tx;
-	struct xsk_umem_info *umem;
-	struct xsk_socket *xsk;
-	struct pkt_stream *pkt_stream;
-	u32 outstanding_tx;
-	u32 rxqsize;
-	u32 batch_size;
-	u8 dst_mac[ETH_ALEN];
-	u8 src_mac[ETH_ALEN];
-	bool check_consumer;
-};
-
-struct pkt {
-	int offset;
-	u32 len;
-	u32 pkt_nb;
-	bool valid;
-	u16 options;
-};
-
-struct pkt_stream {
-	u32 nb_pkts;
-	u32 current_pkt_nb;
-	struct pkt *pkts;
-	u32 max_pkt_len;
-	u32 nb_rx_pkts;
-	u32 nb_valid_entries;
-	bool verbatim;
-};
-
-struct set_hw_ring {
-	u32 default_tx;
-	u32 default_rx;
-};
-
-struct ifobject;
-struct test_spec;
-typedef int (*validation_func_t)(struct ifobject *ifobj);
-typedef void *(*thread_func_t)(void *arg);
-typedef int (*test_func_t)(struct test_spec *test);
-
-struct ifobject {
-	char ifname[MAX_INTERFACE_NAME_CHARS];
-	struct xsk_socket_info *xsk;
-	struct xsk_socket_info *xsk_arr;
-	struct xsk_umem_info *umem;
-	thread_func_t func_ptr;
-	validation_func_t validation_func;
-	struct xsk_xdp_progs *xdp_progs;
-	struct bpf_map *xskmap;
-	struct bpf_program *xdp_prog;
-	struct ethtool_ringparam ring;
-	struct set_hw_ring set_ring;
-	enum test_mode mode;
-	int ifindex;
-	int mtu;
-	u32 bind_flags;
-	u32 xdp_zc_max_segs;
-	bool tx_on;
-	bool rx_on;
-	bool use_poll;
-	bool busy_poll;
-	bool use_fill_ring;
-	bool release_rx;
-	bool shared_umem;
-	bool use_metadata;
-	bool unaligned_supp;
-	bool multi_buff_supp;
-	bool multi_buff_zc_supp;
-	bool hw_ring_size_supp;
-};
-
-struct test_spec {
-	struct ifobject *ifobj_tx;
-	struct ifobject *ifobj_rx;
-	struct pkt_stream *tx_pkt_stream_default;
-	struct pkt_stream *rx_pkt_stream_default;
-	struct bpf_program *xdp_prog_rx;
-	struct bpf_program *xdp_prog_tx;
-	struct bpf_map *xskmap_rx;
-	struct bpf_map *xskmap_tx;
-	test_func_t test_func;
-	int mtu;
-	u16 total_steps;
-	u16 current_step;
-	u16 nb_sockets;
-	bool fail;
-	bool set_ring;
-	bool adjust_tail;
-	bool adjust_tail_support;
-	enum test_mode mode;
-	char name[MAX_TEST_NAME_SIZE];
-};
-
-pthread_barrier_t barr;
-pthread_mutex_t pacing_mutex = PTHREAD_MUTEX_INITIALIZER;
-
-int pkts_in_flight;
-
-static const u8 g_mac[ETH_ALEN] = {0x55, 0x44, 0x33, 0x22, 0x11, 0x00};
-
 #endif				/* XSKXCEIVER_H_ */
-- 
2.51.0




  parent reply	other threads:[~2026-02-25  1:44 UTC|newest]

Thread overview: 1453+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-02-25  1:15 [PATCH 6.18 000/641] 6.18.14-rc1 review Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.18 001/641] RDMA/siw: Fix potential NULL pointer dereference in header processing Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.18 002/641] RDMA/umad: Reject negative data_len in ib_umad_write Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.18 003/641] auxdisplay: arm-charlcd: fix release_mem_region() size Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.18 004/641] hfsplus: return error when node already exists in hfs_bnode_create Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.18 005/641] rcu: Fix rcu_read_unlock() deadloop due to softirq Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.18 006/641] audit: move the compat_xxx_class[] extern declarations to audit_arch.h Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.18 007/641] selftests/resctrl: Fix a division by zero error on Hygon Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.18 008/641] i3c: Move device name assignment after i3c_bus_init Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.18 009/641] device_cgroup: remove branch hint after code refactor Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.18 010/641] fs: move initializing f_mode before file_ref_init() Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.18 011/641] fs: add <linux/init_task.h> for init_fs Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.18 012/641] i3c: master: Update hot-join flag only on success Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.18 013/641] gfs2: Retries missing in gfs2_{rename,exchange} Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.18 014/641] gfs2: Fix slab-use-after-free in qd_put Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.18 015/641] gfs2: Fix use-after-free in iomap inline data write path Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.18 016/641] i3c: dw: Initialize spinlock to avoid upsetting lockdep Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.18 017/641] i3c: dw: Fix memory leak in dw_i3c_master_i2c_xfers() Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.18 018/641] tpm: tpm_i2c_infineon: Fix locality leak on get_burstcount() failure Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.18 019/641] tpm: st33zp24: Fix missing cleanup on get_burstcount() error Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.18 020/641] erofs: get rid of raw bi_end_io() usage Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.18 021/641] erofs: handle end of filesystem properly for file-backed mounts Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.18 022/641] btrfs: headers cleanup to remove unnecessary local includes Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.18 023/641] btrfs: remove btrfs_bio::fs_info by extracting it from btrfs_bio::inode Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.18 024/641] btrfs: make sure all btrfs_bio::end_io are called in task context Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.18 025/641] btrfs: introduce btrfs_bio::async_csum Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.18 026/641] btrfs: add orig_logical to btrfs_bio for encryption Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.18 027/641] btrfs: zoned: dont zone append to conventional zone Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.18 028/641] btrfs: qgroup: return correct error when deleting qgroup relation item Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.18 029/641] btrfs: fix block_group_tree dirty_list corruption Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.18 030/641] btrfs: fix EEXIST abort due to non-consecutive gaps in chunk allocation Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.18 031/641] erofs: fix inline data read failure for ztailpacking pclusters Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.18 032/641] smb: client: fix potential UAF and double free in smb2_open_file() Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.18 033/641] netfs: avoid double increment of retry_count in subreq Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 034/641] rnbd-srv: Fix server side setting of bi_size for special IOs Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 035/641] ACPI: processor: Update cpuidle driver check in __acpi_processor_start() Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 036/641] xen/virtio: Dont use grant-dma-ops when running as Dom0 Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 037/641] io_uring: use release-acquire ordering for IORING_SETUP_R_DISABLED Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 038/641] ACPICA: Fix NULL pointer dereference in acpi_ev_address_space_dispatch() Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 039/641] io_uring/eventfd: remove unused ctx->evfd_last_cq_tail member Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 040/641] io_uring/sync: validate passed in offset Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 041/641] cpuidle: governors: menu: Always check timers with tick stopped Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 042/641] thermal: intel: x86_pkg_temp_thermal: Handle invalid temperature Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 043/641] md/raid5: fix raid5_run() to return error when log_init() fails Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 044/641] md/raid10: fix any_working flag handling in raid10_sync_request Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 045/641] md/raid5: fix IO hang with degraded array with llbitmap Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 046/641] md/md-llbitmap: fix percpu_ref not resurrected on suspend timeout Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 047/641] OPP: Return correct value in dev_pm_opp_get_level Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 048/641] cpufreq: scmi: Fix device_node reference leak in scmi_cpu_domain_id() Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 049/641] iomap: fix submission side handling of completion side errors Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 050/641] thermal/of: Fix reference leak in thermal_of_cm_lookup() Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 051/641] ublk: restore auto buf unregister refcount optimization Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 052/641] ublk: Validate SQE128 flag before accessing the cmd Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 053/641] Partial revert "x86/xen: fix balloon target initialization for PVH dom0" Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 054/641] md/raid1: fix memory leak in raid1_run() Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 055/641] md: fix return value of mddev_trylock Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 056/641] PM: wakeup: Handle empty list in wakeup_sources_walk_start() Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 057/641] arm64/gcs: Fix error handling in arch_set_shadow_stack_status() Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 058/641] perf: arm_spe: Properly set hw.state on failures Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 059/641] cpufreq: intel_pstate: Enable asym capacity only when CPU SMT is not possible Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 060/641] PM: sleep: wakeirq: harden dev_pm_clear_wake_irq() against races Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 061/641] s390/cio: Fix device lifecycle handling in css_alloc_subchannel() Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 062/641] io_uring/kbuf: fix memory leak if io_buffer_add_list fails Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 063/641] x86/cpu/amd: Correct the microcode table for Zenbleed Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 064/641] perf/x86/core: Do not set bit width for unavailable counters Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 065/641] crypto: qat - fix warning on adf_pfvf_pf_proto.c Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 066/641] selftests/bpf: veristat: fix printing order in output_stats() Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 067/641] libbpf: Fix OOB read in btf_dump_get_bitfield_value Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 068/641] sched: Export hidden tracepoints to modules Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 069/641] ARM: VDSO: Patch out __vdso_clock_getres() if unavailable Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 070/641] time/sched_clock: Use ACCESS_PRIVATE() to evaluate hrtimer::function Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 071/641] sched: Fix build for modules using set_tsk_need_resched() Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 072/641] crypto: cavium - fix dma_free_coherent() size Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 073/641] crypto: octeontx " Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 074/641] crypto: hisilicon/zip - adjust the way to obtain the req in the callback function Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 075/641] crypto: hisilicon/sec - move backlog management to qp and store sqe in qp for callback Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 076/641] crypto: hisilicon/hpre: extend tag field to 64 bits for better performance Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 077/641] crypto: hisilicon/qm - enhance the configuration of req_type in queue attributes Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 078/641] crypto: hisilicon/qm - centralize the sending locks of each module into qm Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 079/641] crypto: hisilicon/zip - support fallback for zip Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 080/641] crypto: hisilicon - consolidate qp creation and start in hisi_qm_alloc_qps_node Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 081/641] crypto: hisilicon/hpre - support the hpre algorithm fallback Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 082/641] crypto: hisilicon/sec2 - support skcipher/aead fallback for hardware queue unavailable Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 083/641] crypto: hisilicon/sgl - fix inconsistent map/unmap direction issue Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 084/641] bpf: Preserve id of register in sync_linked_regs() Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 085/641] bpf: Fix memory access flags in helper prototypes Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 086/641] selftests/bpf: Fix resource leak in serial_test_wq on attach failure Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 087/641] hrtimer: Fix trace oddity Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 088/641] crypto: inside-secure/eip93 - fix kernel panic in driver detach Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 089/641] crypto: ccp - Fix a case where SNP_SHUTDOWN is missed Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 090/641] crypto: ccp - narrow scope of snp_range_list Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 091/641] hwrng: airoha - set rng quality to 900 Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 092/641] rqspinlock: Fix TAS fallback lock entry creation Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.18 093/641] bpf, sockmap: Fix incorrect copied_seq calculation Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 094/641] bpf, sockmap: Fix FIONREAD for sockmap Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 095/641] bpf: Fix tcx/netkit detach permissions when prog fd isnt given Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 096/641] bpf: Fix verifier_bug_if to account for BPF_CALL Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 097/641] crypto: ccp - Fix a crash due to incorrect cleanup usage of kfree Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 098/641] crypto: inside-secure/eip93 - unregister only available algorithm Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 099/641] x86/fgraph: Fix return_to_handler regs.rsp value Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 100/641] x86/fgraph,bpf: Switch kprobe_multi program stack unwind to hw_regs path Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 101/641] selftests/bpf: Fix kprobe multi stacktrace_ips test Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 102/641] crypto: hisilicon/trng - support tfms sharing the device Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 103/641] crypto: caam - fix netdev memory leak in dpaa2_caam_probe Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 104/641] bpf: Fix bpf_xdp_store_bytes proto for read-only arg Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 105/641] genirq: Set IRQF_COND_ONESHOT in devm_request_irq() Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 106/641] platform/x86: int0002: Remove IRQF_ONESHOT from request_irq() Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 107/641] iommu/amd: Use cores primary handler and set IRQF_ONESHOT Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 108/641] Bluetooth: btintel_pcie: Use IRQF_ONESHOT and default primary handler Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 109/641] scsi: efct: " Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 110/641] EDAC/altera: Remove IRQF_ONESHOT Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 111/641] usb: typec: fusb302: " Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 112/641] rtc: amlogic-a4: " Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 113/641] mfd: wm8350-core: Use IRQF_ONESHOT Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 114/641] media: pci: mg4b: Use IRQF_NO_THREAD Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 115/641] sched/deadline: Clear the defer params Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 116/641] sched/rt: Skip currently executing CPU in rto_next_cpu() Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 117/641] fs/tests: exec: drop duplicate bprm_stack_limits test vectors Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 118/641] bpf: Limit bpf program signature size Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 119/641] bpf: Require frozen map for calculating map hash Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 120/641] crypto: starfive - Fix memory leak in starfive_aes_aead_do_one_req() Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 121/641] hwrng: core - Allow runtime disabling of the HW RNG Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 122/641] hwrng: core - use RCU and work_struct to fix race condition Greg Kroah-Hartman
2026-02-25  1:17 ` Greg Kroah-Hartman [this message]
2026-02-25  1:17 ` [PATCH 6.18 124/641] selftests/xsk: properly handle batch ending in the middle of a packet Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 125/641] selftests/xsk: fix number of Tx frags in invalid packet Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 126/641] pstore/ram: fix buffer overflow in persistent_ram_save_old() Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 127/641] soc: qcom: smem: handle ENOMEM error during probe Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 128/641] EDAC/i5000: Fix snprintf() size calculation in calculate_dimm_size() Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 129/641] EDAC/i5400: Fix snprintf() limit " Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 130/641] firmware: arm_ffa: Correct 32-bit response handling in NOTIFICATION_INFO_GET Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 131/641] arm64: dts: tqma8mpql-mba8mpxl: Fix HDMI CEC pad control settings Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 132/641] arm64: dts: tqma8mpql-mba8mp-ras314: " Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 133/641] clk: qcom: Return correct error code in qcom_cc_probe_by_index() Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 134/641] arm64: dts: qcom: sdm630: fix gpu_speed_bin size Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 135/641] arm64: dts: qcom: sdm845-oneplus: Dont mark ts supply boot-on Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 136/641] arm64: dts: qcom: sdm845-oneplus: Dont keep panel regulator always on Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 137/641] arm64: dts: qcom: sdm845-oneplus: Mark l14a regulator as boot-on Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 138/641] arm64: dts: qcom: x1e80100: Fix USB combo PHYs SS1 and SS2 ref clocks Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 139/641] arm64: dts: renesas: r9a09g047e57-smarc: Remove duplicate SW_LCD_EN Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 140/641] arm64: dts: qcom: msm8994-octagon: Fix Analog Devices vendor prefix of AD7147 Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 141/641] ARM: dts: allwinner: sun5i-a13-utoo-p66: delete "power-gpios" property Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 142/641] powerpc/uaccess: Move barrier_nospec() out of allow_read_{from/write}_user() Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 143/641] soc: qcom: cmd-db: Use devm_memremap() to fix memory leak in cmd_db_dev_probe Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 144/641] soc: mediatek: svs: Fix memory leak in svs_enable_debug_write() Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 145/641] powerpc/eeh: fix recursive pci_lock_rescan_remove locking in EEH event handling Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 146/641] arm64: dts: renesas: rzt2h-n2h-evk-common: Use GPIO for SD0 write protect Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 147/641] arm: dts: lpc32xx: add clocks property to Motor Control PWM device tree node Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 148/641] arm64: dts: mediatek: mt8183-jacuzzi-pico6: Fix typo in pinmux node Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 149/641] arm64: dts: amlogic: s4: assign mmc b clock to 24MHz Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 150/641] arm64: dts: amlogic: s4: fix mmc clock assignment Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 151/641] arm64: dts: ti: k3-j784s4-main.dtsi: Move c71_3 node to appropriate order Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 152/641] arm64: dts: ti: k3-j784s4-j742s2-main-common.dtsi: Refactor watchdog instances for j784s4 Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.18 153/641] soc: qcom: ubwc: add missing include Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 154/641] hwspinlock: omap: Handle devm_pm_runtime_enable() errors Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 155/641] arm64: dts: amlogic: c3: assign the MMC signal clocks Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 156/641] arm64: dts: amlogic: axg: " Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 157/641] arm64: dts: amlogic: gx: " Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 158/641] arm64: dts: amlogic: g12: assign the MMC B and C " Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 159/641] arm64: dts: amlogic: g12: assign the MMC A signal clock Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 160/641] arm64: dts: qcom: qrb4210-rb2: Fix UART3 wakeup IRQ storm Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 161/641] arm64: dts: qcom: sdm845-db845c: drop CS from SPIO0 Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 162/641] arm64: dts: qcom: sdm845-db845c: specify power for WiFi CH1 Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 163/641] arm64: dts: qcom: x1e: bus is 40-bits (fix 64GB models) Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 164/641] arm64: dts: qcom: talos: Drop opp-shared from QUP OPP table Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 165/641] arm64: dts: qcom: agatti: Add CX_MEM/DBGC GPU regions Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 166/641] arm64: dts: qcom: sm6115: " Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 167/641] reset: canaan: k230: drop OF dependency and enable by default Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 168/641] drm/panthor: Recover from panthor_gpu_flush_caches() failures Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 169/641] drm/panthor: Fix the full_tick check Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 170/641] drm/panthor: Fix the group priority rotation logic Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 171/641] drm/panthor: Fix immediate ticking on a disabled tick Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 172/641] drm/panthor: Fix the logic that decides when to stop ticking Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 173/641] drm/panthor: Make sure we resume the tick when new jobs are submitted Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 174/641] workqueue: Factor out assign_rescuer_work() Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 175/641] workqueue: Only assign rescuer work when really needed Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 176/641] workqueue: Process rescuer work items one-by-one using a cursor Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 177/641] drm/panthor: Fix panthor_gpu_coherency_set() Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 178/641] accel/amdxdna: Fix race where send ring appears full due to delayed head update Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 179/641] drm/panel: sw43408: Remove manual invocation of unprepare at remove Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 180/641] ALSA: pcm: Relax __free() variable declarations Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 181/641] ALSA: vmaster: " Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 182/641] ASoC: SDCA: Allow sample width wild cards in set_usage() Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 183/641] drm/panthor: Evict groups before VM termination Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 184/641] smack: /smack/doi must be > 0 Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 185/641] smack: /smack/doi: accept previously used values Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 186/641] ASoC: nau8821: Fixup nau8821_enable_jack_detect() Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 187/641] media: chips-media: wave5: Fix memory leak on codec_info allocation failure Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 188/641] drm/amd: Drop "amdgpu kernel modesetting enabled" message Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 189/641] drm/amdkfd: Fix signal_eviction_fence() bool return value Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 190/641] drm/amdgpu: Use explicit VCN instance 0 in SR-IOV init Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 191/641] drm/msm/disp/dpu: add merge3d support for sc7280 Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 192/641] drm/msm/dpu: Set vsync source irrespective of mdp top support Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 193/641] drm/msm/dpu: fix WD timer handling on DPU 8.x Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 194/641] drm/msm/dp: Update msm_dp_controller IDs for sa8775p Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 195/641] mei: late_bind: fix struct intel_lb_component_ops kernel-doc Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 196/641] regulator: core: move supply check earlier in set_machine_constraints() Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 197/641] HID: playstation: Add missing check for input_ff_create_memless Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 198/641] drm/msm/disp: set num_planes to 1 for interleaved YUV formats Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 199/641] drm/msm/dpu: fix CMD panels on DPU 1.x - 3.x Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 200/641] drm/msm/dsi_phy_14nm: convert from divider_round_rate() to divider_determine_rate() Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 201/641] accel/amdxdna: Fix notifier_wq flushing warning Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 202/641] media: ccs: Accommodate C-PHY into the calculation Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 203/641] drm/msm/a2xx: fix pixel shader start on A225 Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 204/641] drm/buddy: release free_trees array on buddy mm teardown Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 205/641] drm/hisilicon/hibmc: fix dp probabilistical detect errors after HPD irq Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 206/641] drm/hisilicon/hibmc: add dp mode valid check Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 207/641] drm/hisilicon/hibmc: fix no showing problem with loading hibmc manually Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 208/641] drm/hisilicon/hibmc: Adding reset colorbar cfg in dp init Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 209/641] drm/rockchip: dw_hdmi_qp: Fix RK3576 HPD interrupt handling Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 210/641] drm/msm/mdss: correct HBB programmed on UBWC 5.x and 6.x devices Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 211/641] drm/msm/dpu: offset HBB values written to DPU by -13 Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 212/641] drm/msm/dpu: program correct register for UBWC config on DPU 8.x+ Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.18 213/641] drm/msm/dp: Avoid division by zero in msm_dp_ctrl_config_msa() Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 214/641] platform/chrome: cros_typec_switch: Dont touch struct fwnode_handle::dev Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 215/641] pwm: tiehrpwm: Enable pwmchips parent device before setting configuration Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 216/641] media: uvcvideo: Fix allocation for small frame sizes Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 217/641] evm: Use ordered xattrs list to calculate HMAC in evm_init_hmac() Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 218/641] drm/xe/ptl: Disable DCC on PTL Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 219/641] drm/xe: Unregister drm device on probe error Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 220/641] mm/slab: fix false lockdep warning in __kfree_rcu_sheaf() Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 221/641] ASoC: tegra: Add AHUB writeable_reg for RX holes Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 222/641] platform/chrome: cros_ec_lightbar: Fix response size initialization Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 223/641] accel/amdxdna: Hold mm structure across iommu_sva_unbind_device() Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 224/641] accel/amdxdna: Stop job scheduling across aie2_release_resource() Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 225/641] accel/amdxdna: Fix memory leak in amdxdna_ubuf_map Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 226/641] HID: intel-ish-hid: fix NULL-ptr-deref in ishtp_bus_remove_all_clients Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 227/641] accel/amdxdna: Fix incorrect error code returned for failed chain command Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 228/641] ASoC: SDCA: Remove outdated todo comment Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 229/641] ASoC: SDCA: Force some SDCA Controls to be volatile Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 230/641] ASoC: SDCA: Handle volatile controls correctly Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 231/641] spi: tools: Add include folder to .gitignore Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 232/641] Revert "hwmon: (ibmpex) fix use-after-free in high/low store" Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 233/641] hwmon: (pmbus/mpq8785) fix VOUT_MODE mismatch during identification Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 234/641] PCI: mediatek: Fix IRQ domain leak when MSI allocation fails Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 235/641] PCI: xilinx: Fix INTx IRQ domain leak in error paths Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 236/641] Documentation: PCI: endpoint: Fix ntb/vntb copy & paste errors Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 237/641] PCI/PM: Avoid redundant delays on D3hot->D3cold Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 238/641] wifi: cfg80211: Fix use_for flag update on BSS refresh Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 239/641] PCI/P2PDMA: Release per-CPU pgmap ref when vm_insert_page() fails Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 240/641] PCI/P2PDMA: Fix p2pmem_alloc_mmap() warning condition Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 241/641] Documentation: tracing: Add PCI tracepoint documentation Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 242/641] PCI: Do not attempt to set ExtTag for VFs Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 243/641] PCI: sophgo: Disable L0s and L1 on Sophgo 2044 PCIe Root Ports Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 244/641] PCI/portdrv: Fix potential resource leak Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 245/641] dm: fix unlocked test for dm_suspended_md Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 246/641] dm: use READ_ONCE in dm_blk_report_zones Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 247/641] PCI/PTM: Fix pcie_ptm_create_debugfs() memory leak Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 248/641] PCI/P2PDMA: Reset page reference count when page mapping fails Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 249/641] wifi: ath9k: add OF dependency to AHB Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 250/641] wifi: ath12k: do WoW offloads only on primary link Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 251/641] quota: fix livelock between quotactl and freeze_super Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 252/641] net: mctp-i2c: fix duplicate reception of old data Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 253/641] mctp i2c: initialise event handler read bytes Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 254/641] wifi: cfg80211: stop NAN and P2P in cfg80211_leave Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 255/641] ext4: fast commit: make s_fc_lock reclaim-safe Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 256/641] netfilter: nf_tables: reset table validation state on abort Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 257/641] netfilter: nf_conncount: make nf_conncount_gc_list() to disable BH Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 258/641] netfilter: nf_conncount: increase the connection clean up limit to 64 Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 259/641] netfilter: nft_compat: add more restrictions on netlink attributes Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 260/641] netfilter: nf_conncount: fix tracking of connections from localhost Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 261/641] kallsyms/bpf: rename __bpf_address_lookup() to bpf_address_lookup() Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 262/641] module: add helper function for reading module_buildid() Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 263/641] kallsyms/ftrace: set module buildid in ftrace_mod_address_lookup() Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 264/641] PCI: Mark 3ware-9650SA Root Port Extended Tags as broken Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 265/641] wifi: rtw89: debug: Fix memory leak in __print_txpwr_map() Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 266/641] iommu/vt-d: Flush cache for PASID table before using it Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 267/641] iommu/vt-d: Clear Present bit before tearing down PASID entry Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 268/641] iommu/vt-d: Clear Present bit before tearing down context entry Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 269/641] dm: use bio_clone_blkg_association Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 270/641] xdrgen: Fix struct prefix for typedef types in program wrappers Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 271/641] NFS: NFSERR_INVAL is not defined by NFSv2 Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 272/641] xdrgen: Initialize data pointer for zero-length items Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.18 273/641] xdrgen: Remove inclusion of nlm4.h header Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 274/641] nfsd: never defer requests during idmap lookup Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 275/641] lib/kstrtox: fix kstrtobool() docstring to mention enabled/disabled Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 276/641] rust: task: restrict Task::group_leader() to current Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 277/641] fat: avoid parent link count underflow in rmdir Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 278/641] PCI: Rewrite bridge window head alignment function Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 279/641] PCI: Stop over-estimating bridge window size Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 280/641] PCI: Remove old_size limit from bridge window sizing Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 281/641] tcp: tcp_tx_timestamp() must look at the rtx queue Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 282/641] PCI: Check parent for NULL in of_pci_bus_release_domain_nr() Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 283/641] wifi: ath10k: sdio: add missing lock protection in ath10k_sdio_fw_crashed_dump() Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 284/641] wifi: ath11k: add usecase firmware handling based on device compatible Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 285/641] wifi: ath12k: Fix index decrement when array_len is zero Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 286/641] wifi: ath12k: clear stale link mapping of ahvif->links_map Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 287/641] PCI: Initialize RCB from pci_configure_device() Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 288/641] PCI/ACPI: Restrict program_hpx_type2() to AER bits Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 289/641] selftests/mm: fix usage of FORCE_READ() in cow tests Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 290/641] selftests/mm: fix faulting-in code in pagemap_ioctl test Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 291/641] ipc: dont audit capability check in ipc_permissions() Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 292/641] ucount: check for CAP_SYS_RESOURCE using ns_capable_noaudit() Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 293/641] jfs: avoid -Wtautological-constant-out-of-range-compare warning Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 294/641] tcp: ECT_1_NEGOTIATION and NEEDS_ACCECN identifiers Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 295/641] tcp: disable RFC3168 fallback identifier for CC modules Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 296/641] tcp: accecn: handle unexpected AccECN negotiation feedback Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 297/641] of: unittest: fix possible null-pointer dereferences in of_unittest_property_copy() Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 298/641] mptcp: do not account for OoO in mptcp_rcvbuf_grow() Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 299/641] mptcp: fix receive space timestamp initialization Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 300/641] octeontx2-af: Fix PF driver crash with kexec kernel booting Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 301/641] bonding: only set speed/duplex to unknown, if getting speed failed Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 302/641] inet: RAW sockets using IPPROTO_RAW MUST drop incoming ICMP Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 303/641] nfc: hci: shdlc: Stop timers and work before freeing context Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 304/641] netfilter: nfnetlink_queue: optimize verdict lookup with hash table Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 305/641] netfilter: nfnetlink_queue: do shared-unconfirmed check before segmentation Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 306/641] netfilter: nft_set_hash: fix get operation on big endian Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 307/641] netfilter: nft_counter: fix reset of counters on 32bit archs Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 308/641] netfilter: nft_set_rbtree: fix bogus EEXIST with NLM_F_CREATE with null interval Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 309/641] netfilter: nft_set_rbtree: check for partial overlaps in anonymous sets Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 310/641] netfilter: nft_set_rbtree: translate rbtree to array for binary search Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 311/641] netfilter: nft_set_rbtree: use binary search array in get command Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 312/641] netfilter: nft_set_rbtree: remove seqcount_rwlock_t Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 313/641] netfilter: nft_set_rbtree: dont gc elements on insert Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 314/641] netfilter: nft_set_rbtree: validate element belonging to interval Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 315/641] netfilter: nft_set_rbtree: validate open interval overlap Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 316/641] PCI: Add ACS quirk for Pericom PI7C9X2G404 switches [12d8:b404] Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 317/641] dpll: add phase-adjust-gran pin attribute Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 318/641] dpll: zl3073x: Specify phase adjustment granularity for pins Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 319/641] dpll: zl3073x: Store raw register values instead of parsed state Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 320/641] dpll: zl3073x: Split ref, out, and synth logic from core Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 321/641] dpll: zl3073x: Cache all output properties in zl3073x_out Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 322/641] dpll: zl3073x: Fix output pin phase adjustment sign Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 323/641] net: hns3: fix double free issue for tx spare buffer Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 324/641] procfs: fix missing RCU protection when reading real_parent in do_task_stat() Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 325/641] smb: client: correct value for smbd_max_fragmented_recv_size Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 326/641] net: atm: fix crash due to unvalidated vcc pointer in sigd_send() Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 327/641] net: sunhme: Fix sbus regression Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 328/641] xfrm: fix ip_rt_bug race in icmp_route_lookup reverse path Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 329/641] serial: caif: fix use-after-free in caif_serial ldisc_close() Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 330/641] octeon_ep: disable per ring interrupts Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 331/641] octeon_ep: ensure dbell BADDR updation Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 332/641] octeon_ep_vf: " Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.18 333/641] ionic: Rate limit unknown xcvr type messages Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 334/641] net: renesas: rswitch: fix forwarding offload statemachine Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 335/641] octeontx2-pf: Unregister devlink on probe failure Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 336/641] af_unix: Fix memleak of newsk in unix_stream_connect() Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 337/641] RDMA/rtrs: server: remove dead code Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 338/641] IB/cache: update gid cache on client reregister event Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 339/641] RDMA/hns: Fix WQ_MEM_RECLAIM warning Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 340/641] RDMA/hns: Fix RoCEv1 failure due to DSCP Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 341/641] RDMA/hns: Notify ULP of remaining soft-WCs during reset Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 342/641] RDMA/mlx5: Fix ucaps init error flow Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 343/641] cxl/mem: Fix devm_cxl_memdev_edac_release() confusion Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 344/641] power: supply: ab8500: Fix use-after-free in power_supply_changed() Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 345/641] power: supply: act8945a: " Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 346/641] power: supply: bq256xx: " Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 347/641] power: supply: bq25980: " Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 348/641] power: supply: cpcap-battery: " Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 349/641] power: supply: goldfish: " Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 350/641] power: supply: pm8916_bms_vm: " Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 351/641] power: supply: pm8916_lbc: " Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 352/641] power: supply: rt9455: " Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 353/641] power: supply: sbs-battery: " Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 354/641] power: reset: nvmem-reboot-mode: respect cell size for nvmem_cell_write Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 355/641] power: supply: bq27xxx: fix wrong errno when bus ops are unsupported Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 356/641] power: supply: wm97xx: Fix NULL pointer dereference in power_supply_changed() Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 357/641] RDMA/rtrs-srv: fix SG mapping Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 358/641] RDMA/rxe: Fix double free in rxe_srq_from_init Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 359/641] RDMA/iwcm: Fix workqueue list corruption by removing work_list Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 360/641] platform/x86: hp-wmi: fix platform profile values for Omen 16-wf1xxx Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 361/641] tools/power/x86/intel-speed-select: Fix file descriptor leak in isolate_cpus() Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 362/641] RDMA/mlx5: Fix UMR hang in LAG error state unload Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 363/641] IB/mlx5: Fix port speed query for representors Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 364/641] mtd: rawnand: cadence: Fix return type of CDMA send-and-wait helper Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 365/641] mtd: intel-dg: Fix accessing regions before setting nregions Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 366/641] vfio/pci: Lock upstream bridge for vfio_pci_core_disable() Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 367/641] platform/x86/amd/pmf: Prevent TEE errors after hibernate Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 368/641] crypto: ccp - Declare PSP dead if PSP_CMD_TEE_RING_INIT fails Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 369/641] crypto: ccp - Add an S4 restore flow Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 370/641] crypto: ccp - Factor out ring destroy handling to a helper Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 371/641] crypto: ccp - Send PSP_CMD_TEE_RING_DESTROY when PSP_CMD_TEE_RING_INIT fails Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 372/641] mtd: parsers: Fix memory leak in mtd_parser_tplink_safeloader_parse() Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 373/641] NFS/localio: Handle short writes by retrying Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 374/641] NFS/localio: prevent direct reclaim recursion into NFS via nfs_writepages Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 375/641] NFS/localio: use GFP_NOIO and non-memreclaim workqueue in nfs_local_commit Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 376/641] NFS/localio: remove -EAGAIN handling in nfs_local_doio() Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 377/641] cxl/core: Fix cxl_dport debugfs EINJ entries Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 378/641] RDMA/rxe: Fix iova-to-va conversion for MR page sizes != PAGE_SIZE Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 379/641] RDMA/uverbs: Validate wqe_size before using it in ib_uverbs_post_send Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 380/641] RDMA/mlx5: Fix memory leak in GET_DATA_DIRECT_SYSFS_PATH handler Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 381/641] RDMA/rxe: Fix race condition in QP timer handlers Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 382/641] RDMA/core: add rdma_rw_max_sge() helper for SQ sizing Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 383/641] cxl: Fix premature commit_end increment on decoder commit failure Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 384/641] mtd: parsers: ofpart: fix OF node refcount leak in parse_fixed_partitions() Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 385/641] mtd: spinand: Fix kernel doc Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 386/641] hisi_acc_vfio_pci: fix VF reset timeout issue Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 387/641] power: supply: pm8916_lbc: Fix use-after-free for extcon in IRQ handler Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 388/641] power: supply: qcom_battmgr: Recognize "LiP" as lithium-polymer Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 389/641] RDMA/uverbs: Add __GFP_NOWARN to ib_uverbs_unmarshall_recv() kmalloc Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.18 390/641] pNFS: fix a missing wake up while waiting on NFS_LAYOUT_DRAIN Greg Kroah-Hartman
  -- strict thread matches above, loose matches on Subject: below --
2026-02-25  1:11 [PATCH 6.19 000/781] 6.19.4-rc1 review Greg Kroah-Hartman
2026-02-25  1:11 ` [PATCH 6.19 001/781] RDMA/siw: Fix potential NULL pointer dereference in header processing Greg Kroah-Hartman
2026-02-25  1:11 ` [PATCH 6.19 002/781] RDMA/umad: Reject negative data_len in ib_umad_write Greg Kroah-Hartman
2026-02-25  1:11 ` [PATCH 6.19 003/781] auxdisplay: arm-charlcd: fix release_mem_region() size Greg Kroah-Hartman
2026-02-25  1:11 ` [PATCH 6.19 004/781] hfsplus: return error when node already exists in hfs_bnode_create Greg Kroah-Hartman
2026-02-25  1:11 ` [PATCH 6.19 005/781] rcutorture: Correctly compute probability to invoke ->exp_current() Greg Kroah-Hartman
2026-02-25  1:11 ` [PATCH 6.19 006/781] rcu: Fix rcu_read_unlock() deadloop due to softirq Greg Kroah-Hartman
2026-02-25  1:11 ` [PATCH 6.19 007/781] audit: move the compat_xxx_class[] extern declarations to audit_arch.h Greg Kroah-Hartman
2026-02-25  1:11 ` [PATCH 6.19 008/781] selftests/resctrl: Fix a division by zero error on Hygon Greg Kroah-Hartman
2026-02-25  1:11 ` [PATCH 6.19 009/781] i3c: Move device name assignment after i3c_bus_init Greg Kroah-Hartman
2026-02-25  1:11 ` [PATCH 6.19 010/781] device_cgroup: remove branch hint after code refactor Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 011/781] fs: move initializing f_mode before file_ref_init() Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 012/781] fs: add <linux/init_task.h> for init_fs Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 013/781] i3c: master: Update hot-join flag only on success Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 014/781] erofs: Use %pe format specifier for error pointers Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 015/781] erofs: avoid noisy messages for transient -ENOMEM Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 016/781] gfs2: Retries missing in gfs2_{rename,exchange} Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 017/781] gfs2: Rename gfs2_log_submit_{bio -> write} Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 018/781] gfs2: Initialize bio->bi_opf early Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 019/781] gfs2: Fix slab-use-after-free in qd_put Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 020/781] iomap: fix invalid folio access after folio_end_read() Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 021/781] gfs2: Fix use-after-free in iomap inline data write path Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 022/781] i3c: dw: Initialize spinlock to avoid upsetting lockdep Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 023/781] i3c: dw: Fix memory leak in dw_i3c_master_i2c_xfers() Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 024/781] tpm: tpm_i2c_infineon: Fix locality leak on get_burstcount() failure Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 025/781] tpm: st33zp24: Fix missing cleanup on get_burstcount() error Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 026/781] erofs: handle end of filesystem properly for file-backed mounts Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 027/781] btrfs: zoned: dont zone append to conventional zone Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 028/781] btrfs: qgroup: return correct error when deleting qgroup relation item Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 029/781] btrfs: fix block_group_tree dirty_list corruption Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 030/781] btrfs: fix EEXIST abort due to non-consecutive gaps in chunk allocation Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 031/781] gfs2: fix memory leaks in gfs2_fill_super error path Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 032/781] erofs: fix inline data read failure for ztailpacking pclusters Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 033/781] smb: client: fix potential UAF and double free in smb2_open_file() Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 034/781] netfs: avoid double increment of retry_count in subreq Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 035/781] tools/nolibc: always use 64-bit mode for s390 header checks Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 036/781] rnbd-srv: Fix server side setting of bi_size for special IOs Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 037/781] docs: find-unused-docs.sh: fixup directory usage Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 038/781] ACPI: processor: Update cpuidle driver check in __acpi_processor_start() Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 039/781] xen/virtio: Dont use grant-dma-ops when running as Dom0 Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 040/781] io_uring: use release-acquire ordering for IORING_SETUP_R_DISABLED Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 041/781] ACPICA: Fix NULL pointer dereference in acpi_ev_address_space_dispatch() Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 042/781] io_uring/eventfd: remove unused ctx->evfd_last_cq_tail member Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 043/781] io_uring/sync: validate passed in offset Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 044/781] cpuidle: governors: menu: Always check timers with tick stopped Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 045/781] thermal: intel: x86_pkg_temp_thermal: Handle invalid temperature Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 046/781] md/raid5: fix raid5_run() to return error when log_init() fails Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 047/781] md/raid10: fix any_working flag handling in raid10_sync_request Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 048/781] md/raid5: fix IO hang with degraded array with llbitmap Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 049/781] md/md-llbitmap: fix percpu_ref not resurrected on suspend timeout Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 050/781] OPP: Return correct value in dev_pm_opp_get_level Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 051/781] cpufreq: scmi: Fix device_node reference leak in scmi_cpu_domain_id() Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 052/781] iomap: fix submission side handling of completion side errors Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 053/781] thermal/of: Fix reference leak in thermal_of_cm_lookup() Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 054/781] ublk: restore auto buf unregister refcount optimization Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 055/781] ublk: Validate SQE128 flag before accessing the cmd Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 056/781] ublk: use READ_ONCE() to read struct ublksrv_ctrl_cmd Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 057/781] Partial revert "x86/xen: fix balloon target initialization for PVH dom0" Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 058/781] md/raid1: fix memory leak in raid1_run() Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 059/781] md: fix return value of mddev_trylock Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 060/781] PM: wakeup: Handle empty list in wakeup_sources_walk_start() Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 061/781] arm64/gcs: Fix error handling in arch_set_shadow_stack_status() Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 062/781] block: dont use strcpy to copy blockdev name Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 063/781] perf: arm_spe: Properly set hw.state on failures Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 064/781] cpufreq: intel_pstate: Enable asym capacity only when CPU SMT is not possible Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 065/781] PM: sleep: wakeirq: harden dev_pm_clear_wake_irq() against races Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 066/781] s390/cio: Fix device lifecycle handling in css_alloc_subchannel() Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 067/781] io_uring/kbuf: fix memory leak if io_buffer_add_list fails Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 068/781] x86/cpu/amd: Correct the microcode table for Zenbleed Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 069/781] perf/x86/core: Do not set bit width for unavailable counters Greg Kroah-Hartman
2026-02-25  1:12 ` [PATCH 6.19 070/781] crypto: qat - fix parameter order used in ICP_QAT_FW_COMN_FLAGS_BUILD Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 071/781] crypto: qat - fix warning on adf_pfvf_pf_proto.c Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 072/781] bpf: bpf_scc_visit instance and backedges accumulation for bpf_loop() Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 073/781] selftests/bpf: veristat: fix printing order in output_stats() Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 074/781] libbpf: Fix OOB read in btf_dump_get_bitfield_value Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 075/781] sched: Export hidden tracepoints to modules Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 076/781] ARM: VDSO: Patch out __vdso_clock_getres() if unavailable Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 077/781] time/sched_clock: Use ACCESS_PRIVATE() to evaluate hrtimer::function Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 078/781] bpf: Return proper address for non-zero offsets in insn array Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 079/781] sched: Fix build for modules using set_tsk_need_resched() Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 080/781] crypto: cavium - fix dma_free_coherent() size Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 081/781] crypto: octeontx " Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 082/781] crypto: hisilicon/zip - adjust the way to obtain the req in the callback function Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 083/781] crypto: hisilicon/sec - move backlog management to qp and store sqe in qp for callback Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 084/781] crypto: hisilicon/hpre: extend tag field to 64 bits for better performance Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 085/781] crypto: hisilicon/qm - enhance the configuration of req_type in queue attributes Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 086/781] crypto: hisilicon/qm - centralize the sending locks of each module into qm Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 087/781] crypto: hisilicon/zip - support fallback for zip Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 088/781] crypto: hisilicon - consolidate qp creation and start in hisi_qm_alloc_qps_node Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 089/781] crypto: hisilicon/hpre - support the hpre algorithm fallback Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 090/781] crypto: hisilicon/sec2 - support skcipher/aead fallback for hardware queue unavailable Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 091/781] crypto: hisilicon/sgl - fix inconsistent map/unmap direction issue Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 092/781] bpf: Preserve id of register in sync_linked_regs() Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 093/781] clocksource/drivers/timer-sp804: Fix an Oops when read_current_timer is called on ARM32 platforms where the SP804 is not registered as the sched_clock Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 094/781] bpf: Fix memory access flags in helper prototypes Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 095/781] selftests/bpf: Fix resource leak in serial_test_wq on attach failure Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 096/781] hrtimer: Fix trace oddity Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 097/781] crypto: inside-secure/eip93 - fix kernel panic in driver detach Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 098/781] crypto: ccp - Fix a case where SNP_SHUTDOWN is missed Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 099/781] crypto: ccp - narrow scope of snp_range_list Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 100/781] hwrng: airoha - set rng quality to 900 Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 101/781] rqspinlock: Fix TAS fallback lock entry creation Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 102/781] bpf, sockmap: Fix incorrect copied_seq calculation Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 103/781] bpf, sockmap: Fix FIONREAD for sockmap Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 104/781] bpf: Fix tcx/netkit detach permissions when prog fd isnt given Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 105/781] seqlock: fix scoped_seqlock_read kernel-doc Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 106/781] x86/hyperv: Fix smp_ops build failure on UP kernels Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 107/781] ftrace,bpf: Remove FTRACE_OPS_FL_JMP ftrace_ops flag Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 108/781] bpf: Fix verifier_bug_if to account for BPF_CALL Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 109/781] crypto: ccp - Fix a crash due to incorrect cleanup usage of kfree Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 110/781] crypto: inside-secure/eip93 - unregister only available algorithm Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 111/781] x86/fgraph: Fix return_to_handler regs.rsp value Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 112/781] x86/fgraph,bpf: Switch kprobe_multi program stack unwind to hw_regs path Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 113/781] selftests/bpf: Fix kprobe multi stacktrace_ips test Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 114/781] crypto: hisilicon/trng - support tfms sharing the device Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 115/781] crypto: caam - fix netdev memory leak in dpaa2_caam_probe Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 116/781] bpf: Fix bpf_xdp_store_bytes proto for read-only arg Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 117/781] genirq: Set IRQF_COND_ONESHOT in devm_request_irq() Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 118/781] platform/x86: int0002: Remove IRQF_ONESHOT from request_irq() Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 119/781] iommu/amd: Use cores primary handler and set IRQF_ONESHOT Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 120/781] Bluetooth: btintel_pcie: Use IRQF_ONESHOT and default primary handler Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 121/781] scsi: efct: " Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 122/781] EDAC/altera: Remove IRQF_ONESHOT Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 123/781] usb: typec: fusb302: " Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 124/781] rtc: amlogic-a4: " Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 125/781] mfd: wm8350-core: Use IRQF_ONESHOT Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 126/781] media: pci: mg4b: Use IRQF_NO_THREAD Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 127/781] sched/deadline: Clear the defer params Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 128/781] sched/rt: Skip currently executing CPU in rto_next_cpu() Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 129/781] sched: Re-evaluate scheduling when migrating queued tasks out of throttled cgroups Greg Kroah-Hartman
2026-02-25  1:13 ` [PATCH 6.19 130/781] fs/tests: exec: drop duplicate bprm_stack_limits test vectors Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 131/781] irqchip/sifive-plic: Handle number of hardware interrupts correctly Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 132/781] bpf: Limit bpf program signature size Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 133/781] bpf: Require frozen map for calculating map hash Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 134/781] crypto: starfive - Fix memory leak in starfive_aes_aead_do_one_req() Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 135/781] hwrng: core - use RCU and work_struct to fix race condition Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 136/781] selftests/xsk: properly handle batch ending in the middle of a packet Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 137/781] selftests/xsk: fix number of Tx frags in invalid packet Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 138/781] pstore/ram: fix buffer overflow in persistent_ram_save_old() Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 139/781] arm64: dts: ti: k3-am69-aquila-dev: Fix USB-C Sink PDO Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 140/781] arm64: dts: ti: k3-am69-aquila-clover: " Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 141/781] soc: qcom: smem: handle ENOMEM error during probe Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 142/781] EDAC/i5000: Fix snprintf() size calculation in calculate_dimm_size() Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 143/781] EDAC/i5400: Fix snprintf() limit " Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 144/781] firmware: arm_ffa: Correct 32-bit response handling in NOTIFICATION_INFO_GET Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 145/781] riscv: dts: sophgo: cv180x: fix USB dwc2 FIFO sizes Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 146/781] arm64: dts: tqma8mpql-mba8mpxl: Fix HDMI CEC pad control settings Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 147/781] arm64: dts: tqma8mpql-mba8mp-ras314: " Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 148/781] EDAC/amd64: Avoid a -Wformat-security warning Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 149/781] clk: qcom: Return correct error code in qcom_cc_probe_by_index() Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 150/781] arm64: dts: qcom: sdm630: fix gpu_speed_bin size Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 151/781] arm64: dts: qcom: sm8150-hdk,mtp: specify ZAP firmware name Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 152/781] arm64: dts: qcom: sm8250-hdk: " Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 153/781] arm64: dts: qcom: sdm850-huawei-matebook-e-2019: Remove duplicate reserved-memroy nodes Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 154/781] arm64: dts: qcom: sdm850-huawei-matebook-e-2019: Correct ipa_fw_mem for the driver to load successfully Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 155/781] arm64: dts: qcom: sdm845-oneplus: Dont mark ts supply boot-on Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 156/781] arm64: dts: qcom: sdm845-oneplus: Dont keep panel regulator always on Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 157/781] arm64: dts: qcom: sdm845-oneplus: Mark l14a regulator as boot-on Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 158/781] arm64: dts: qcom: x1e80100: Fix USB combo PHYs SS1 and SS2 ref clocks Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 159/781] arm64: dts: renesas: r9a09g047e57-smarc: Remove duplicate SW_LCD_EN Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 160/781] arm64: dts: qcom: msm8994-octagon: Fix Analog Devices vendor prefix of AD7147 Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 161/781] ARM: dts: allwinner: sun5i-a13-utoo-p66: delete "power-gpios" property Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 162/781] powerpc/uaccess: Move barrier_nospec() out of allow_read_{from/write}_user() Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 163/781] soc: qcom: cmd-db: Use devm_memremap() to fix memory leak in cmd_db_dev_probe Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 164/781] soc: mediatek: svs: Fix memory leak in svs_enable_debug_write() Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 165/781] powerpc/eeh: fix recursive pci_lock_rescan_remove locking in EEH event handling Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 166/781] arm64: dts: renesas: rzt2h-n2h-evk-common: Use GPIO for SD0 write protect Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 167/781] arm: dts: lpc32xx: add clocks property to Motor Control PWM device tree node Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 168/781] arm64: dts: mediatek: mt8183-jacuzzi-pico6: Fix typo in pinmux node Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 169/781] arm64: dts: amlogic: s4: assign mmc b clock to 24MHz Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 170/781] arm64: dts: amlogic: s4: fix mmc clock assignment Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 171/781] arm64: dts: ti: k3-j784s4-main.dtsi: Move c71_3 node to appropriate order Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 172/781] arm64: dts: ti: k3-j784s4-j742s2-main-common.dtsi: Refactor watchdog instances for j784s4 Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 173/781] soc: qcom: ubwc: add missing include Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 174/781] hwspinlock: omap: Handle devm_pm_runtime_enable() errors Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 175/781] arm64: dts: amlogic: c3: assign the MMC signal clocks Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 176/781] arm64: dts: amlogic: axg: " Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 177/781] arm64: dts: amlogic: gx: " Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 178/781] arm64: dts: amlogic: g12: assign the MMC B and C " Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 179/781] arm64: dts: amlogic: g12: assign the MMC A signal clock Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 180/781] arm64: dts: qcom: qrb4210-rb2: Fix UART3 wakeup IRQ storm Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 181/781] arm64: dts: qcom: sdm845-db845c: drop CS from SPIO0 Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 182/781] arm64: dts: qcom: sdm845-db845c: specify power for WiFi CH1 Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 183/781] arm64: dts: ti: k3-am67a-kontron-sa67-base: Fix CMA node Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 184/781] arm64: dts: ti: k3-am67a-kontron-sa67-base: Fix SD card regulator Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 185/781] arm64: dts: qcom: x1e: bus is 40-bits (fix 64GB models) Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 186/781] arm64: dts: imx95: Use GPU_CGC as core clock for GPU Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 187/781] arm64: dts: qcom: talos: Drop opp-shared from QUP OPP table Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 188/781] arm64: dts: amlogic: meson-sm1-odroid: Eliminate Odroid HC4 power glitches during boot Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 189/781] arm64: dts: qcom: agatti: Add CX_MEM/DBGC GPU regions Greg Kroah-Hartman
2026-02-25  1:14 ` [PATCH 6.19 190/781] arm64: dts: qcom: sm6115: " Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 191/781] reset: canaan: k230: drop OF dependency and enable by default Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 192/781] drm/xe/pf: Fix .bulk_profile/sched_priority description Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 193/781] drm/panthor: Recover from panthor_gpu_flush_caches() failures Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 194/781] drm/panthor: Fix the full_tick check Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 195/781] drm/panthor: Fix the group priority rotation logic Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 196/781] drm/panthor: Fix immediate ticking on a disabled tick Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 197/781] drm/panthor: Fix the logic that decides when to stop ticking Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 198/781] drm/panthor: Make sure we resume the tick when new jobs are submitted Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 199/781] drm/panthor: Remove redundant call to disable the MCU Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 200/781] drm/panthor: fix queue_reset_timeout_locked Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 201/781] workqueue: Process rescuer work items one-by-one using a cursor Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 202/781] drm/amdgpu: dont attach the tlb fence for SI Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 203/781] drm/panthor: Fix panthor_gpu_coherency_set() Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 204/781] accel/amdxdna: Fix race condition when checking rpm_on Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 205/781] accel/amdxdna: Fix cu_idx being cleared by memset() during command setup Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 206/781] drm/plane: Fix IS_ERR() vs NULL bug drm_plane_create_color_pipeline_property() Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 207/781] accel/amdxdna: Fix race where send ring appears full due to delayed head update Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 208/781] firmware: cs_dsp: Remove __free() from cs_dsp_debugfs_string_read() Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 209/781] firmware: cs_dsp: Dont use __free() in cs_dsp_load() and cs_dsp_load_coeff() Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 210/781] spi: cadence-qspi: Remove redundant pm_runtime_mark_last_busy call Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 211/781] accel/amdxdna: Fix potential NULL pointer dereference in context cleanup Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 212/781] drm/panel: sw43408: Remove manual invocation of unprepare at remove Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 213/781] ALSA: compress_offload: Relax __free() variable declarations Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 214/781] ALSA: control: " Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 215/781] ALSA: pcm: " Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 216/781] ALSA: oss: " Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 217/781] ALSA: seq: " Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 218/781] ALSA: seq: " Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 219/781] ALSA: timer: " Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 220/781] ALSA: vmaster: " Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 221/781] ALSA: hda: " Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 222/781] ALSA: usx2y: " Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 223/781] ALSA: usb-audio: " Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 224/781] ASoC: SDCA: Allow sample width wild cards in set_usage() Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 225/781] drm/panthor: Fix NULL pointer dereference on panthor_fw_unplug Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 226/781] drm/i915/colorop: do not include headers from headers Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 227/781] drm/panthor: Evict groups before VM termination Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 228/781] drm/display/dp_mst: Add protection against 0 vcpi Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 229/781] drm/atomic: convert drm_atomic_get_{old, new}_colorop_state() into proper functions Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 230/781] ima: Fix stack-out-of-bounds in is_bprm_creds_for_exec() Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 231/781] smack: /smack/doi must be > 0 Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 232/781] smack: /smack/doi: accept previously used values Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 233/781] ASoC: nau8821: Fixup nau8821_enable_jack_detect() Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 234/781] ASoC: nau8821: Cancel delayed work on component remove Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 235/781] ASoC: nau8821: Cancel pending work before suspend Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 236/781] media: chips-media: wave5: Fix memory leak on codec_info allocation failure Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 237/781] drm/amd/display: Dont use kernel-doc comment in dc_register_software_state struct Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 238/781] drm/amdgpu: Describe @AMD_IP_BLOCK_TYPE_RAS in amd_ip_block_type enum Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 239/781] drm/amd: Drop "amdgpu kernel modesetting enabled" message Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 240/781] drm/amdkfd: Fix signal_eviction_fence() bool return value Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 241/781] drm/amdgpu: Use explicit VCN instance 0 in SR-IOV init Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 242/781] drm/amd/display: Remove unused encoder types Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 243/781] drm/amd/display: Use local variable for analog_engine initialization Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 244/781] drm/amd/display: Pass proper DAC encoder ID to VBIOS Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 245/781] drm/amd/display: Update dc_connection_dac_load to dc_connection_analog_load Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 246/781] drm/amd/display: Dont repeat DAC load detection Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 247/781] drm/msm/disp/dpu: add merge3d support for sc7280 Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 248/781] drm/msm/dpu: Set vsync source irrespective of mdp top support Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 249/781] drm/msm/dpu: fix WD timer handling on DPU 8.x Greg Kroah-Hartman
2026-02-25  1:15 ` [PATCH 6.19 250/781] drm/msm/dp: Update msm_dp_controller IDs for sa8775p Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 251/781] ALSA: hda - fix function names & missing function parameter Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 252/781] mei: late_bind: fix struct intel_lb_component_ops kernel-doc Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 253/781] spi: microchip-core: use XOR instead of ANDNOT to fix the logic Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 254/781] regulator: core: fix locking in regulator_resolve_supply() error path Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 255/781] regulator: core: move supply check earlier in set_machine_constraints() Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 256/781] regulator: core: dont ignore errors from event forwarding setup Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 257/781] HID: playstation: Add missing check for input_ff_create_memless Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 258/781] drm/amdgpu/ttm: Pin 4K MMIO_REMAP Singleton BO at Init v2 Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 259/781] drm/amdgpu: Drop MMIO_REMAP domain bit and keep it Internal Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 260/781] gpu: nova-core: check for overflow to DMATRFBASE1 Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 261/781] drm/msm/disp: set num_planes to 1 for interleaved YUV formats Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 262/781] drm/msm/dpu: drop intr_start from DPU 3.x catalog files Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 263/781] drm/msm/dpu: fix CMD panels on DPU 1.x - 3.x Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 264/781] drm/msm/dsi_phy_14nm: convert from divider_round_rate() to divider_determine_rate() Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 265/781] accel/amdxdna: Fix notifier_wq flushing warning Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 266/781] drm/msm: Fix x2-85 TPL1_DBG_ECO_CNTL1 Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 267/781] drm/msm: Fix GMEM_BASE for gen8 Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 268/781] media: ccs: Accommodate C-PHY into the calculation Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 269/781] drm/msm/a2xx: fix pixel shader start on A225 Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 270/781] drm/buddy: release free_trees array on buddy mm teardown Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 271/781] drm/hisilicon/hibmc: fix dp probabilistical detect errors after HPD irq Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 272/781] drm/hisilicon/hibmc: add dp mode valid check Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 273/781] drm/hisilicon/hibmc: fix no showing problem with loading hibmc manually Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 274/781] drm/hisilicon/hibmc: Adding reset colorbar cfg in dp init Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 275/781] drm/rockchip: dw_hdmi_qp: Fix RK3576 HPD interrupt handling Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 276/781] rust: pwm: Fix potential memory leak on init error Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 277/781] drm/amd/pm: Fix unneeded semicolon warning Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 278/781] drm/msm/mdss: correct HBB programmed on UBWC 5.x and 6.x devices Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 279/781] drm/msm/dpu: offset HBB values written to DPU by -13 Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 280/781] drm/msm/dpu: program correct register for UBWC config on DPU 8.x+ Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 281/781] drm/msm/dpu: fix SSPP_UBWC_STATIC_CTRL programming on UBWC 5.x+ Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 282/781] drm/msm/dp: Avoid division by zero in msm_dp_ctrl_config_msa() Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 283/781] platform/chrome: cros_typec_switch: Dont touch struct fwnode_handle::dev Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 284/781] pwm: tiehrpwm: Enable pwmchips parent device before setting configuration Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 285/781] drm/amd/pm: Return -EOPNOTSUPP when cant read power limit Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 286/781] media: uvcvideo: Fix allocation for small frame sizes Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 287/781] evm: Use ordered xattrs list to calculate HMAC in evm_init_hmac() Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 288/781] drm/xe/ptl: Disable DCC on PTL Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 289/781] drm/xe: Unregister drm device on probe error Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 290/781] mm/slab: fix false lockdep warning in __kfree_rcu_sheaf() Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 291/781] ASoC: tegra: Add AHUB writeable_reg for RX holes Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 292/781] platform/chrome: cros_ec_lightbar: Fix response size initialization Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 293/781] accel/amdxdna: Hold mm structure across iommu_sva_unbind_device() Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 294/781] accel/amdxdna: Stop job scheduling across aie2_release_resource() Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 295/781] accel/amdxdna: Fix memory leak in amdxdna_ubuf_map Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 296/781] drm/i915/display: fix the pixel normalization handling for xe3p_lpd Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 297/781] HID: intel-ish-hid: fix NULL-ptr-deref in ishtp_bus_remove_all_clients Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 298/781] HID: Intel-thc-hid: Intel-thc: Fix wrong register fields updating Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 299/781] accel/amdxdna: Enable temporal sharing only mode Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 300/781] accel/amdxdna: Remove hardware context status Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 301/781] accel/amdxdna: Fix incorrect error code returned for failed chain command Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 302/781] ASoC: SDCA: Remove outdated todo comment Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 303/781] ASoC: SDCA: Handle volatile controls correctly Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 304/781] ASoC: SDCA: Factor out jack handling into new c file Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 305/781] ASoC: SDCA: Add ability to connect SDCA jacks to ASoC jacks Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 306/781] ASoC: SDCA: Still process most of the jack detect if control is missing Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 307/781] accel/amdxdna: Fix incorrect DPM level after suspend/resume Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 308/781] accel/amdxdna: Move RPM resume into job run function Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 309/781] ASoC: cs4271: Fix resource leak in cs4271_soc_resume() Greg Kroah-Hartman
2026-02-25  1:16 ` [PATCH 6.19 310/781] vsnprintf: drop __printf() attributes on binary printing functions Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 311/781] ALSA: oss: delete self assignment Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 312/781] spi: tools: Add include folder to .gitignore Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 313/781] Revert "hwmon: (ibmpex) fix use-after-free in high/low store" Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 314/781] hwmon: (pmbus/mpq8785) fix VOUT_MODE mismatch during identification Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 315/781] PCI: mediatek: Fix IRQ domain leak when MSI allocation fails Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 316/781] wifi: rtw89: correct use sequence of driver_data in skb->info Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 317/781] PCI: xilinx: Fix INTx IRQ domain leak in error paths Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 318/781] Documentation: PCI: endpoint: Fix ntb/vntb copy & paste errors Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 319/781] PCI: Add WQ_PERCPU to alloc_workqueue() users Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 320/781] PCI: endpoint: Add missing NULL check for alloc_workqueue() Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 321/781] PCI: rzg3s-host: Use pci_generic_config_write() for the root bus Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 322/781] PCI/PM: Avoid redundant delays on D3hot->D3cold Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 323/781] wifi: cfg80211: Fix use_for flag update on BSS refresh Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 324/781] PCI/P2PDMA: Release per-CPU pgmap ref when vm_insert_page() fails Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 325/781] PCI/P2PDMA: Fix p2pmem_alloc_mmap() warning condition Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 326/781] Documentation: tracing: Add PCI tracepoint documentation Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 327/781] PCI: Do not attempt to set ExtTag for VFs Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 328/781] PCI: sophgo: Disable L0s and L1 on Sophgo 2044 PCIe Root Ports Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 329/781] PCI/portdrv: Fix potential resource leak Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 330/781] dm: fix unlocked test for dm_suspended_md Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 331/781] dm: use READ_ONCE in dm_blk_report_zones Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 332/781] PCI/PTM: Fix pcie_ptm_create_debugfs() memory leak Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 333/781] PCI/P2PDMA: Reset page reference count when page mapping fails Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 334/781] wifi: ath9k: debug.h: fix kernel-doc bad lines and struct ath_tx_stats Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 335/781] wifi: ath9k: fix kernel-doc warnings in common-debug.h Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 336/781] wifi: ath9k: add OF dependency to AHB Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 337/781] wifi: ath12k: do WoW offloads only on primary link Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 338/781] quota: fix livelock between quotactl and freeze_super Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 339/781] PCI/pwrctrl: tc9563: Use put_device() instead of i2c_put_adapter() Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 340/781] net: mctp-i2c: fix duplicate reception of old data Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 341/781] mctp i2c: initialise event handler read bytes Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 342/781] wifi: cfg80211: stop NAN and P2P in cfg80211_leave Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 343/781] iommupt: Do not set C-bit on MMIO backed PTEs Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 344/781] ext4: fast commit: make s_fc_lock reclaim-safe Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 345/781] netfilter: nf_tables: reset table validation state on abort Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 346/781] netfilter: nf_conncount: increase the connection clean up limit to 64 Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 347/781] netfilter: nft_compat: add more restrictions on netlink attributes Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 348/781] netfilter: nf_conncount: fix tracking of connections from localhost Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 349/781] kallsyms/bpf: rename __bpf_address_lookup() to bpf_address_lookup() Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 350/781] module: add helper function for reading module_buildid() Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 351/781] kallsyms/ftrace: set module buildid in ftrace_mod_address_lookup() Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 352/781] PCI: Mark 3ware-9650SA Root Port Extended Tags as broken Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 353/781] wifi: rtw89: debug: Fix memory leak in __print_txpwr_map() Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 354/781] iommu/vt-d: Flush cache for PASID table before using it Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 355/781] iommu/vt-d: Clear Present bit before tearing down PASID entry Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 356/781] iommu/vt-d: Clear Present bit before tearing down context entry Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 357/781] iommu/vt-d: Fix race condition during PASID entry replacement Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 358/781] dm: use bio_clone_blkg_association Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 359/781] xdrgen: Fix struct prefix for typedef types in program wrappers Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 360/781] NFS: NFSERR_INVAL is not defined by NFSv2 Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 361/781] xdrgen: Initialize data pointer for zero-length items Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 362/781] xdrgen: Remove inclusion of nlm4.h header Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 363/781] nfsd: never defer requests during idmap lookup Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 364/781] lib/kstrtox: fix kstrtobool() docstring to mention enabled/disabled Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 365/781] lib/Kconfig.debug: fix BOOTPARAM_HUNG_TASK_PANIC comment Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 366/781] rust: task: restrict Task::group_leader() to current Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 367/781] fat: avoid parent link count underflow in rmdir Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 368/781] PCI: Rewrite bridge window head alignment function Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 369/781] PCI: Stop over-estimating bridge window size Greg Kroah-Hartman
2026-02-25  1:17 ` [PATCH 6.19 370/781] PCI: Remove old_size limit from bridge window sizing Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 371/781] tcp: tcp_tx_timestamp() must look at the rtx queue Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 372/781] Bluetooth: hci_conn: Fix using conn->le_{tx,rx}_phy as supported PHYs Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 373/781] PCI: Check parent for NULL in of_pci_bus_release_domain_nr() Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 374/781] wifi: ath10k: sdio: add missing lock protection in ath10k_sdio_fw_crashed_dump() Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 375/781] wifi: ath11k: add usecase firmware handling based on device compatible Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 376/781] wifi: ath12k: Fix index decrement when array_len is zero Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 377/781] wifi: ath12k: clear stale link mapping of ahvif->links_map Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 378/781] PCI: Initialize RCB from pci_configure_device() Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 379/781] PCI/ACPI: Restrict program_hpx_type2() to AER bits Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 380/781] Revert "net/smc: Introduce TCP ULP support" Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 381/781] selftests/mm: fix usage of FORCE_READ() in cow tests Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 382/781] selftests/mm: fix faulting-in code in pagemap_ioctl test Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 383/781] ipc: dont audit capability check in ipc_permissions() Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 384/781] ucount: check for CAP_SYS_RESOURCE using ns_capable_noaudit() Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 385/781] jfs: avoid -Wtautological-constant-out-of-range-compare warning Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 386/781] PCI: s32g: Skip Root Port removal during success Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 387/781] tcp: ECT_1_NEGOTIATION and NEEDS_ACCECN identifiers Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 388/781] tcp: disable RFC3168 fallback identifier for CC modules Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 389/781] tcp: accecn: handle unexpected AccECN negotiation feedback Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 390/781] PCI: Add preceding capability position support in PCI_FIND_NEXT_*_CAP macros Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 391/781] PCI: dwc: Add new APIs to remove standard and extended Capability Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 392/781] PCI: dwc: ep: Cache MSI outbound iATU mapping Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 393/781] PCI: dwc: Remove duplicate dw_pcie_ep_hide_ext_capability() function Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 394/781] PCI: endpoint: Add dynamic_inbound_mapping EPC feature Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 395/781] PCI: endpoint: Add BAR subrange mapping support Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 396/781] PCI: dwc: Advertise dynamic inbound " Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 397/781] PCI: dwc: ep: Support BAR subrange inbound mapping via Address Match Mode iATU Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 398/781] PCI: dwc: ep: Fix resizable BAR support for multi-PF configurations Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 399/781] PCI: dwc: ep: Add per-PF BAR and inbound ATU mapping support Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 400/781] of: unittest: fix possible null-pointer dereferences in of_unittest_property_copy() Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 401/781] mptcp: do not account for OoO in mptcp_rcvbuf_grow() Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 402/781] mptcp: fix receive space timestamp initialization Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 403/781] octeontx2-af: Fix PF driver crash with kexec kernel booting Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 404/781] bonding: only set speed/duplex to unknown, if getting speed failed Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 405/781] inet: RAW sockets using IPPROTO_RAW MUST drop incoming ICMP Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 406/781] nfc: hci: shdlc: Stop timers and work before freeing context Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 407/781] amd-xgbe: do not select NET_SELFTESTS when INET is disabled Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 408/781] netfilter: nfnetlink_queue: optimize verdict lookup with hash table Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 409/781] netfilter: nfnetlink_queue: do shared-unconfirmed check before segmentation Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 410/781] netfilter: nft_set_hash: fix get operation on big endian Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 411/781] netfilter: nft_counter: fix reset of counters on 32bit archs Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 412/781] netfilter: nft_set_rbtree: fix bogus EEXIST with NLM_F_CREATE with null interval Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 413/781] netfilter: nft_set_rbtree: check for partial overlaps in anonymous sets Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 414/781] netfilter: nft_set_rbtree: translate rbtree to array for binary search Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 415/781] netfilter: nft_set_rbtree: use binary search array in get command Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 416/781] netfilter: nft_set_rbtree: remove seqcount_rwlock_t Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 417/781] netfilter: nft_set_rbtree: dont gc elements on insert Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 418/781] netfilter: nft_set_rbtree: validate element belonging to interval Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 419/781] netfilter: nft_set_rbtree: validate open interval overlap Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 420/781] PCI: rzg3s-host: Fix device node reference leak in rzg3s_pcie_host_parse_port() Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 421/781] PCI: Add ACS quirk for Pericom PI7C9X2G404 switches [12d8:b404] Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 422/781] rust: driver-core: use "kernel vertical" style for imports Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 423/781] rust: devres: fix race condition due to nesting Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 424/781] dpll: zl3073x: Fix output pin phase adjustment sign Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 425/781] net: hns3: fix double free issue for tx spare buffer Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 426/781] procfs: fix missing RCU protection when reading real_parent in do_task_stat() Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 427/781] smb: client: correct value for smbd_max_fragmented_recv_size Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 428/781] net: atm: fix crash due to unvalidated vcc pointer in sigd_send() Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 429/781] net: sunhme: Fix sbus regression Greg Kroah-Hartman
2026-02-25  1:18 ` [PATCH 6.19 430/781] xfrm: fix ip_rt_bug race in icmp_route_lookup reverse path Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 431/781] serial: caif: fix use-after-free in caif_serial ldisc_close() Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 432/781] octeon_ep: disable per ring interrupts Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 433/781] octeon_ep: ensure dbell BADDR updation Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 434/781] octeon_ep_vf: " Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 435/781] ionic: Rate limit unknown xcvr type messages Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 436/781] net: renesas: rswitch: fix forwarding offload statemachine Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 437/781] octeontx2-pf: Unregister devlink on probe failure Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 438/781] af_unix: Fix memleak of newsk in unix_stream_connect() Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 439/781] RDMA/rtrs: server: remove dead code Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 440/781] IB/cache: update gid cache on client reregister event Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 441/781] RDMA/hns: Fix WQ_MEM_RECLAIM warning Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 442/781] RDMA/hns: Return actual error code instead of fixed EINVAL Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 443/781] RDMA/hns: Fix RoCEv1 failure due to DSCP Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 444/781] RDMA/hns: Notify ULP of remaining soft-WCs during reset Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 445/781] RDMA/mlx5: Fix ucaps init error flow Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 446/781] cxl/mem: Fix devm_cxl_memdev_edac_release() confusion Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 447/781] power: supply: ab8500: Fix use-after-free in power_supply_changed() Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 448/781] power: supply: act8945a: " Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 449/781] power: supply: bq256xx: " Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 450/781] power: supply: bq25980: " Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 451/781] power: supply: cpcap-battery: " Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 452/781] power: supply: goldfish: " Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 453/781] power: supply: pf1550: " Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 454/781] power: supply: pm8916_bms_vm: " Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 455/781] power: supply: pm8916_lbc: " Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 456/781] power: supply: rt9455: " Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 457/781] power: supply: sbs-battery: " Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 458/781] power: reset: nvmem-reboot-mode: respect cell size for nvmem_cell_write Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 459/781] power: supply: bq27xxx: fix wrong errno when bus ops are unsupported Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 460/781] power: supply: wm97xx: Fix NULL pointer dereference in power_supply_changed() Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 461/781] RDMA/rtrs-srv: fix SG mapping Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 462/781] RDMA/rxe: Fix double free in rxe_srq_from_init Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 463/781] RDMA/iwcm: Fix workqueue list corruption by removing work_list Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 464/781] platform/x86: hp-wmi: fix platform profile values for Omen 16-wf1xxx Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 465/781] tools/power/x86/intel-speed-select: Fix file descriptor leak in isolate_cpus() Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 466/781] RDMA/mlx5: Fix UMR hang in LAG error state unload Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 467/781] IB/mlx5: Fix port speed query for representors Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 468/781] mtd: rawnand: cadence: Fix return type of CDMA send-and-wait helper Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 469/781] mtd: intel-dg: Fix accessing regions before setting nregions Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 470/781] vfio/pci: Lock upstream bridge for vfio_pci_core_disable() Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 471/781] platform/x86/amd/pmf: Prevent TEE errors after hibernate Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 472/781] crypto: ccp - Declare PSP dead if PSP_CMD_TEE_RING_INIT fails Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 473/781] crypto: ccp - Add an S4 restore flow Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 474/781] crypto: ccp - Factor out ring destroy handling to a helper Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 475/781] crypto: ccp - Send PSP_CMD_TEE_RING_DESTROY when PSP_CMD_TEE_RING_INIT fails Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 476/781] mtd: parsers: Fix memory leak in mtd_parser_tplink_safeloader_parse() Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 477/781] NFS/localio: Handle short writes by retrying Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 478/781] NFS/localio: prevent direct reclaim recursion into NFS via nfs_writepages Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 479/781] NFS/localio: use GFP_NOIO and non-memreclaim workqueue in nfs_local_commit Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 480/781] NFS/localio: remove -EAGAIN handling in nfs_local_doio() Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 481/781] cxl/hdm: Fix newline character in dev_err() messages Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 482/781] cxl/core: Fix cxl_dport debugfs EINJ entries Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 483/781] RDMA/rxe: Fix iova-to-va conversion for MR page sizes != PAGE_SIZE Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 484/781] ata: libata: Add ATA_QUIRK_MAX_SEC and convert all device quirks Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 485/781] ata: libata-core: Quirk INTEL SSDSC2KG480G8 max_sectors Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 486/781] RDMA/uverbs: Validate wqe_size before using it in ib_uverbs_post_send Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 487/781] RDMA/mlx5: Fix memory leak in GET_DATA_DIRECT_SYSFS_PATH handler Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 488/781] RDMA/rxe: Fix race condition in QP timer handlers Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 489/781] RDMA/core: add rdma_rw_max_sge() helper for SQ sizing Greg Kroah-Hartman
2026-02-25  1:19 ` [PATCH 6.19 490/781] cxl: Fix premature commit_end increment on decoder commit failure Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 491/781] mtd: parsers: ofpart: fix OF node refcount leak in parse_fixed_partitions() Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 492/781] mtd: spinand: Fix kernel doc Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 493/781] hisi_acc_vfio_pci: fix VF reset timeout issue Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 494/781] power: supply: pm8916_lbc: Fix use-after-free for extcon in IRQ handler Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 495/781] power: supply: qcom_battmgr: Recognize "LiP" as lithium-polymer Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 496/781] RDMA/uverbs: Add __GFP_NOWARN to ib_uverbs_unmarshall_recv() kmalloc Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 497/781] pNFS: fix a missing wake up while waiting on NFS_LAYOUT_DRAIN Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 498/781] scsi: smartpqi: Fix memory leak in pqi_report_phys_luns() Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 499/781] scsi: ufs: host: mediatek: Require CONFIG_PM Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 500/781] scsi: csiostor: Fix dereference of null pointer rn Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 501/781] nvdimm: virtio_pmem: serialize flush requests Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 502/781] fs/nfs: Fix readdir slow-start regression Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 503/781] tracing: Properly process error handling in event_hist_trigger_parse() Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 504/781] tracing: Remove duplicate ENABLE_EVENT_STR and DISABLE_EVENT_STR macros Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 505/781] remoteproc: imx_rproc: Use strstarts for "rsc-table" check Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 506/781] remoteproc: imx_dsp_rproc: Fix multiple start/stop operations Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 507/781] remoteproc: imx_dsp_rproc: Only reset carveout memory at RPROC_OFFLINE state Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 508/781] Revert "mailbox/pcc: support mailbox management of the shared buffer" Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 509/781] fbdev: of_display_timing: Fix device node reference leak in of_get_display_timings() Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 510/781] fbdev: au1200fb: Fix a memory leak in au1200fb_drv_probe() Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 511/781] clk: thead: th1520-ap: Poll for PLL lock and wait for stability Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 512/781] clk: spacemit: Respect Kconfig setting when building modules Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 513/781] clk: qcom: gcc-sm8550: Use floor ops for SDCC RCGs Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 514/781] clk: qcom: gcc-sm8650: " Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 515/781] clk: qcom: rcg2: compute 2d using duty fraction directly Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 516/781] clk: meson: gxbb: Limit the HDMI PLL OD to /4 on GXL/GXM SoCs Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 517/781] clk: meson: g12a: Limit the HDMI PLL OD to /4 Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 518/781] clk: qcom: gcc-sm8450: Update the SDCC RCGs to use shared_floor_ops Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 519/781] clk: qcom: gcc-sm8750: " Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 520/781] clk: qcom: gcc-sm4450: " Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 521/781] clk: qcom: gcc-sdx75: " Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 522/781] clk: qcom: gcc-milos: " Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 523/781] clk: qcom: gcc-x1e80100: " Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 524/781] clk: qcom: gcc-qdu1000: " Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 525/781] clk: qcom: gcc-glymur: " Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 526/781] clk: qcom: gcc-msm8953: Remove ALWAYS_ON flag from cpp_gdsc Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 527/781] clk: qcom: gcc-msm8917: " Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 528/781] clk: qcom: gcc-ipq5018: flag sleep clock as critical Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 529/781] clk: qcom: alpha-pll: convert from divider_round_rate() to divider_determine_rate() Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 530/781] clk: rockchip: Fix error pointer check after rockchip_clk_register_gate_link() Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 531/781] clk: microchip: core: remove duplicate determine_rate on pic32_sclk_ops Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 532/781] Input: adp5589 - remove a leftover header file Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 533/781] clk: Move clk_{save,restore}_context() to COMMON_CLK section Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 534/781] clk: qcom: regmap-divider: convert from divider_ro_round_rate() to divider_ro_determine_rate() Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 535/781] clk: qcom: regmap-divider: convert from divider_round_rate() to divider_determine_rate() Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 536/781] clk: qcom: dispcc-sdm845: Enable parents for pixel clocks Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 537/781] clk: qcom: dispcc-sm7150: Fix dispcc_mdss_pclk1_clk_src Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 538/781] clk: qcom: gfx3d: add parent to parent request map Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 539/781] clk: actions: owl-composite: convert from owl_divider_helper_round_rate() to divider_determine_rate() Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 540/781] clk: actions: owl-divider: convert from divider_round_rate() " Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 541/781] clk: bm1880: " Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 542/781] clk: hisilicon: clkdivider-hi6220: " Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 543/781] clk: loongson1: " Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 544/781] clk: milbeaut: " Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 545/781] clk: nuvoton: ma35d1-divider: " Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 546/781] clk: nxp: lpc32xx: " Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 547/781] clk: sophgo: sg2042-clkgen: " Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 548/781] clk: sprd: div: " Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 549/781] clk: stm32: stm32-core: convert from divider_ro_round_rate() to divider_ro_determine_rate() Greg Kroah-Hartman
2026-02-25  1:20 ` [PATCH 6.19 550/781] clk: stm32: stm32-core: convert from divider_round_rate_parent() to divider_determine_rate() Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 551/781] clk: versaclock3: convert from divider_round_rate() " Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 552/781] clk: x86: cgu: " Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 553/781] clk: zynqmp: divider: " Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 554/781] clk: mediatek: Drop __initconst from gates Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 555/781] clk: mediatek: Add mfg_eb as parent to mt8196 mfgpll clocks Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 556/781] clk: mediatek: Fix error handling in runtime PM setup Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 557/781] clk: zynqmp: divider: Fix zynqmp_clk_divider_determine_rate kerneldoc Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 558/781] clk: zynqmp: pll: " Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 559/781] interconnect: mediatek: Dont hijack parent device Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 560/781] interconnect: mediatek: Aggregate bandwidth with saturating add Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 561/781] dmaengine: mediatek: uart-apdma: Fix above 4G addressing TX/RX Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 562/781] dma: dma-axi-dmac: fix SW cyclic transfers Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 563/781] dma: dma-axi-dmac: fix HW scatter-gather not looking at the queue Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 564/781] phy: rockchip: samsung-hdptx: Pre-compute HDMI PLL config for 461.10125 MHz output Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 565/781] char: misc: Use IS_ERR() for filp_open() return value Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 566/781] soundwire: intel_ace2x: add SND_HDA_CORE dependency Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 567/781] iio: test: drop dangling symbol in gain-time-scale helpers Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 568/781] usb: typec: ucsi: drop an unused Kconfig symbol Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 569/781] staging: greybus: lights: avoid NULL deref Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 570/781] serial: imx: change SERIAL_IMX_CONSOLE to bool Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 571/781] serial: SH_SCI: improve "DMA support" prompt Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 572/781] gpib: Fix error code in ibonline() Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 573/781] gpib: Fix error code in ni_usb_write_registers() Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 574/781] gpib: Fix memory leak in ni_usb_init() Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 575/781] stm class: Kconfig: correct symbol name Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 576/781] mmc: rtsx_pci_sdmmc: increase power-on settling delay to 5ms Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 577/781] iio: pressure: mprls0025pa: fix spi_transfer struct initialisation Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 578/781] iio: pressure: mprls0025pa: fix SPI CS delay violation Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 579/781] iio: pressure: mprls0025pa: fix interrupt flag Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 580/781] iio: pressure: mprls0025pa: fix scan_type struct Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 581/781] iio: pressure: mprls0025pa: fix pressure calculation Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 582/781] watchdog: starfive-wdt: Fix PM reference leak in probe error path Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 583/781] coresight: etm3x: Fix cpulocked warning on cpuhp Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 584/781] backlight: aw99706: Fix build errors caused by wrong gpio header Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 585/781] phy: freescale: imx8qm-hsio: fix NULL pointer dereference Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 586/781] interconnect: qcom: qcs8300: fix the num_links for nsp icc node Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 587/781] coresight: tmc-etr: Fix race condition between sysfs and perf mode Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 588/781] Revert "mmc: rtsx_pci_sdmmc: increase power-on settling delay to 5ms" Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 589/781] mfd: arizona: Fix regulator resource leak on wm5102_clear_write_sequencer() failure Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 590/781] mfd: simple-mfd-i2c: Add Delta TN48M CPLD support Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 591/781] mfd: sec: Fix IRQ domain names duplication Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 592/781] drivers: iio: mpu3050: use dev_err_probe for regulator request Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 593/781] usb: bdc: fix sleep during atomic Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 594/781] nvmem: an8855: drop an unused Kconfig symbol Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 595/781] mcb: fix incorrect sanity check Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 596/781] pinctrl: equilibrium: Fix device node reference leak in pinbank_init() Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 597/781] ovl: Fix uninit-value in ovl_fill_real Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 598/781] nfsd: do not allow exporting of special kernel filesystems Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 599/781] iio: sca3000: Fix a resource leak in sca3000_probe() Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 600/781] mips: LOONGSON32: drop a dangling Kconfig symbol Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 601/781] pidfs: return -EREMOTE when PIDFD_GET_INFO is called on another ns Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 602/781] pinctrl: qcom: sm8250-lpass-lpi: Fix i2s2_data_groups definition Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 603/781] pinctrl: meson: amlogic-a4: Fix device node reference leak in bank helpers Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 604/781] pinctrl: single: fix refcount leak in pcs_add_gpio_func() Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 605/781] pinctrl: canaan: k230: Fix NULL pointer dereference when parsing devicetree Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 606/781] leds: expresswire: Fix chip state breakage Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 607/781] leds: qcom-lpg: Check the return value of regmap_bulk_write() Greg Kroah-Hartman
2026-02-25  1:21 ` [PATCH 6.19 608/781] backlight: qcom-wled: Support ovp values for PMI8994 Greg Kroah-Hartman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260225012352.122240034@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=ast@kernel.org \
    --cc=bastien.curutchet@bootlin.com \
    --cc=maciej.fijalkowski@intel.com \
    --cc=patches@lists.linux.dev \
    --cc=sashal@kernel.org \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox