All of lore.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.