]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
selftests: bpf: fix pkt grow tests
authorMaciej Fijalkowski <maciej.fijalkowski@intel.com>
Thu, 2 Apr 2026 15:49:56 +0000 (17:49 +0200)
committerJakub Kicinski <kuba@kernel.org>
Tue, 7 Apr 2026 01:43:51 +0000 (18:43 -0700)
Skip tail adjust tests in xskxceiver for SKB mode as it is not very
friendly for it. multi-buffer case does not work as xdp_rxq_info that is
registered for generic XDP does not report ::frag_size. The non-mbuf
path copies packet via skb_pp_cow_data() which only accounts for
headroom, leaving us with no tailroom and causing underlying XDP prog to
drop packets therefore.

For multi-buffer test on other modes, change the amount of bytes we use
for growth, assume worst-case scenario and take care of headroom and
tailroom.

Reviewed-by: Björn Töpel <bjorn@kernel.org>
Signed-off-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
Link: https://patch.msgid.link/20260402154958.562179-7-maciej.fijalkowski@intel.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
tools/testing/selftests/bpf/prog_tests/test_xsk.c

index 62118ffba661f024642e57e6a56810a89e6ccc9f..ee60bcc22ee4f3a1014ec15ebde35ebcb813394e 100644 (file)
@@ -2528,16 +2528,34 @@ int testapp_adjust_tail_shrink_mb(struct test_spec *test)
 
 int testapp_adjust_tail_grow(struct test_spec *test)
 {
+       if (test->mode == TEST_MODE_SKB)
+               return TEST_SKIP;
+
        /* 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)
 {
+       u32 grow_size;
+
+       if (test->mode == TEST_MODE_SKB)
+               return TEST_SKIP;
+
+       /* worst case scenario is when underlying setup will work on 3k
+        * buffers, let us account for it; given that we will use 6k as
+        * pkt_len, expect that it will be broken down to 2 descs each
+        * with 3k payload;
+        *
+        * 4k is truesize, 3k payload, 256 HR, 320 TR;
+        */
+       grow_size = XSK_UMEM__MAX_FRAME_SIZE -
+                   XSK_UMEM__LARGE_FRAME_SIZE -
+                   XDP_PACKET_HEADROOM -
+                   test->ifobj_tx->umem_tailroom;
        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);
+
+       return testapp_adjust_tail(test, grow_size, XSK_UMEM__LARGE_FRAME_SIZE * 2);
 }
 
 int testapp_tx_queue_consumer(struct test_spec *test)