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