Re: [PATCH bpf-next v2 1/3] bpf: Fix an issue in bpf_prog_test_run_xdp when page size greater than 4K

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On 6/11/25 12:24 PM, Alexei Starovoitov wrote:
On Wed, Jun 11, 2025 at 10:15 AM Yonghong Song <yonghong.song@xxxxxxxxx> wrote:
The bpf selftest xdp_adjust_tail/xdp_adjust_frags_tail_grow failed on
arm64 with 64KB page:
    xdp_adjust_tail/xdp_adjust_frags_tail_grow:FAIL

In bpf_prog_test_run_xdp(), the xdp->frame_sz is set to 4K, but later on
when constructing frags, with 64K page size, the frag data_len could
be more than 4K. This will cause problems in bpf_xdp_frags_increase_tail().

To fix the failure, the xdp->frame_sz is set to be PAGE_SIZE so kernel
can test different page size properly. With the kernel change, the user
space and bpf prog needs adjustment. Currently, the MAX_SKB_FRAGS default
value is 17, so for 4K page, the maximum packet size will be less than 68K.
To test 64K page, a bigger maximum packet size than 68K is desired. So two
different functions are implemented for subtest xdp_adjust_frags_tail_grow.
Depending on different page size, different data input/output sizes are used
to adapt with different page size.

Signed-off-by: Yonghong Song <yonghong.song@xxxxxxxxx>
---
  net/bpf/test_run.c                            |  2 +-
  .../bpf/prog_tests/xdp_adjust_tail.c          | 95 +++++++++++++++++--
  .../bpf/progs/test_xdp_adjust_tail_grow.c     |  8 +-
  3 files changed, 96 insertions(+), 9 deletions(-)

diff --git a/net/bpf/test_run.c b/net/bpf/test_run.c
index aaf13a7d58ed..9728dbd4c66c 100644
--- a/net/bpf/test_run.c
+++ b/net/bpf/test_run.c
@@ -1255,7 +1255,7 @@ int bpf_prog_test_run_xdp(struct bpf_prog *prog, const union bpf_attr *kattr,
                 headroom -= ctx->data;
         }

-       max_data_sz = 4096 - headroom - tailroom;
+       max_data_sz = PAGE_SIZE - headroom - tailroom;
         if (size > max_data_sz) {
                 /* disallow live data mode for jumbo frames */
                 if (do_live)
diff --git a/tools/testing/selftests/bpf/prog_tests/xdp_adjust_tail.c b/tools/testing/selftests/bpf/prog_tests/xdp_adjust_tail.c
index e361129402a1..133bde28a489 100644
--- a/tools/testing/selftests/bpf/prog_tests/xdp_adjust_tail.c
+++ b/tools/testing/selftests/bpf/prog_tests/xdp_adjust_tail.c
@@ -37,21 +37,25 @@ static void test_xdp_adjust_tail_shrink(void)
         bpf_object__close(obj);
  }

-static void test_xdp_adjust_tail_grow(void)
+static void test_xdp_adjust_tail_grow(bool is_64k_pagesize)
  {
         const char *file = "./test_xdp_adjust_tail_grow.bpf.o";
         struct bpf_object *obj;
-       char buf[4096]; /* avoid segfault: large buf to hold grow results */
+       char buf[8192]; /* avoid segfault: large buf to hold grow results */
         __u32 expect_sz;
         int err, prog_fd;
         LIBBPF_OPTS(bpf_test_run_opts, topts,
                 .data_in = &pkt_v4,
-               .data_size_in = sizeof(pkt_v4),
                 .data_out = buf,
                 .data_size_out = sizeof(buf),
                 .repeat = 1,
         );

+       if (is_64k_pagesize)
+               topts.data_size_in = sizeof(pkt_v4) - 1;
+       else
+               topts.data_size_in = sizeof(pkt_v4);
Please add a comment that magic data size is a special
signal to bpf prog:

Ok, will add a comment to explain this.


         if (data_len == 54) { /* sizeof(pkt_v4) */
-               offset = 4096; /* test too large offset */
+               offset = 4096; /* test too large offset, 4k page size */
+       } else if (data_len == 53) { /* sizeof(pkt_v4) - 1 */
+               offset = 65536; /* test too large offset, 64k page size */
         } else if (data_len == 74) { /* sizeof(pkt_v6) */
                 offset = 40;
and comment about 90000, 90001 sizes.

Ack as well.






[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux