On Tue, 10 Sept 2024 at 14:41, Maciej Fijalkowski <maciej.fijalkowski@xxxxxxxxx> wrote: > > 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. Acked-by: Magnus Karlsson <magnus.karlsson@xxxxxxxxx> > Signed-off-by: Maciej Fijalkowski <maciej.fijalkowski@xxxxxxxxx> > --- > > v2: instead of failing the test case when reading frag value from sysctl > file did not succeed, use a default count and proceed with test [Magnus] > > tools/testing/selftests/bpf/xskxceiver.c | 43 +++++++++++++++++++++--- > tools/testing/selftests/bpf/xskxceiver.h | 1 - > 2 files changed, 38 insertions(+), 6 deletions(-) > > diff --git a/tools/testing/selftests/bpf/xskxceiver.c b/tools/testing/selftests/bpf/xskxceiver.c > index 92af633faea8..11f047b8af75 100644 > --- a/tools/testing/selftests/bpf/xskxceiver.c > +++ b/tools/testing/selftests/bpf/xskxceiver.c > @@ -325,6 +325,25 @@ 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'}, > @@ -2245,13 +2264,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; > > @@ -2281,7 +2311,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) > diff --git a/tools/testing/selftests/bpf/xskxceiver.h b/tools/testing/selftests/bpf/xskxceiver.h > index 885c948c5d83..e46e823f6a1a 100644 > --- a/tools/testing/selftests/bpf/xskxceiver.h > +++ b/tools/testing/selftests/bpf/xskxceiver.h > @@ -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 > -- > 2.34.1 > >