From: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
To: Magnus Karlsson <magnus.karlsson@gmail.com>
Cc: <bpf@vger.kernel.org>, <ast@kernel.org>, <daniel@iogearbox.net>,
<andrii@kernel.org>, <netdev@vger.kernel.org>,
<magnus.karlsson@intel.com>, <bjorn@kernel.org>
Subject: Re: [PATCH bpf-next] selftests: xsk: read current MAX_SKB_FRAGS from sysctl knob
Date: Tue, 10 Sep 2024 14:00:40 +0200 [thread overview]
Message-ID: <ZuA06PPYp2Jblg56@boxer> (raw)
In-Reply-To: <CAJ8uoz0BDJ=y-5M3=Wrz7F1LtT8AUVCyNh1G88SaKv+yEYL-Bg@mail.gmail.com>
On Tue, Sep 10, 2024 at 01:48:35PM +0200, Magnus Karlsson wrote:
> On Mon, 9 Sept 2024 at 16:12, Maciej Fijalkowski
> <maciej.fijalkowski@intel.com> 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.
> >
> > Signed-off-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
> > ---
> > tools/testing/selftests/bpf/xskxceiver.c | 41 +++++++++++++++++++++---
> > tools/testing/selftests/bpf/xskxceiver.h | 1 -
> > 2 files changed, 36 insertions(+), 6 deletions(-)
> >
> > diff --git a/tools/testing/selftests/bpf/xskxceiver.c b/tools/testing/selftests/bpf/xskxceiver.c
> > index 92af633faea8..595b6da26897 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,22 @@ 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)
> > + return TEST_FAILURE;
>
> Thanks for this fix Maciej. However, I think failing the test here is
> a little bit too drastic. How about just returning TEST_SKIP and print
> out that the max number of skbs is unknown as the reason for the skip?
> Or even more optimistically, print out a warning that we could not
> read the max number of skb but we are guessing 17 and then run the
> test? If it passes, great we guessed correctly, but if it fails we are
> not worse off than the current code.
makes sense to default to 17 if we couldn't read it from file. will fix in
v2.
> Do not know how often a file
> system does not contain /proc/sys/net/core/max_skb_frags though.
A mix of CONFIG_NET, CONFIG_PROC_FS and CONFIG_SYSCTL i think.
>
> > + 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 +2309,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
> >
> >
prev parent reply other threads:[~2024-09-10 12:00 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-09 14:11 [PATCH bpf-next] selftests: xsk: read current MAX_SKB_FRAGS from sysctl knob Maciej Fijalkowski
2024-09-10 11:48 ` Magnus Karlsson
2024-09-10 12:00 ` Maciej Fijalkowski [this message]
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=ZuA06PPYp2Jblg56@boxer \
--to=maciej.fijalkowski@intel.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bjorn@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=magnus.karlsson@gmail.com \
--cc=magnus.karlsson@intel.com \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.