selftests/xsk: Read current MAX_SKB_FRAGS from sysctl knob
authorMaciej Fijalkowski <maciej.fijalkowski@intel.com>
Tue, 10 Sep 2024 12:41:29 +0000 (14:41 +0200)
committerDaniel Borkmann <daniel@iogearbox.net>
Wed, 11 Sep 2024 13:48:35 +0000 (15:48 +0200)
Currently, xskxceiver assumes that MAX_SKB_FRAGS value is always 17
which is not true - since the introduction of BIG TCP this can now take
any value between 17 to 45 via CONFIG_MAX_SKB_FRAGS.

Adjust the TOO_MANY_FRAGS test case to read the currently configured
MAX_SKB_FRAGS value by reading it from /proc/sys/net/core/max_skb_frags.
If running system does not provide that sysctl file then let us try
running the test with a default value.

Signed-off-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Magnus Karlsson <magnus.karlsson@intel.com>
Link: https://lore.kernel.org/bpf/20240910124129.289874-1-maciej.fijalkowski@intel.com
tools/testing/selftests/bpf/xskxceiver.c
tools/testing/selftests/bpf/xskxceiver.h

index 8144fd1452375211f7f1862233dd067efc265eee..1ee0ef114f9da55dda5907d1a0dc74e8bf80757d 100644 (file)
@@ -324,6 +324,25 @@ out:
        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'},
@@ -2244,13 +2263,24 @@ static int testapp_poll_rxq_tmout(struct test_spec *test)
 
 static int testapp_too_many_frags(struct test_spec *test)
 {
-       struct pkt pkts[2 * XSK_DESC__MAX_SKB_FRAGS + 2] = {};
+       struct pkt *pkts;
        u32 max_frags, i;
+       int ret;
 
-       if (test->mode == TEST_MODE_ZC)
+       if (test->mode == TEST_MODE_ZC) {
                max_frags = test->ifobj_tx->xdp_zc_max_segs;
-       else
-               max_frags = XSK_DESC__MAX_SKB_FRAGS;
+       } 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;
 
@@ -2280,7 +2310,10 @@ static int testapp_too_many_frags(struct test_spec *test)
        pkts[2 * max_frags + 1].valid = true;
 
        pkt_stream_generate_custom(test, pkts, 2 * max_frags + 2);
-       return testapp_validate_traffic(test);
+       ret = testapp_validate_traffic(test);
+
+       free(pkts);
+       return ret;
 }
 
 static int xsk_load_xdp_programs(struct ifobject *ifobj)
index 885c948c5d83befe075c8b4b375a7661813eaa4d..e46e823f6a1aaa6880fe1141c571e81e3732b77c 100644 (file)
@@ -55,7 +55,6 @@
 #define XSK_UMEM__LARGE_FRAME_SIZE (3 * 1024)
 #define XSK_UMEM__MAX_FRAME_SIZE (4 * 1024)
 #define XSK_DESC__INVALID_OPTION (0xffff)
-#define XSK_DESC__MAX_SKB_FRAGS 18
 #define HUGEPAGE_SIZE (2 * 1024 * 1024)
 #define PKT_DUMP_NB_TO_PRINT 16
 #define RUN_ALL_TESTS UINT_MAX