]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
selftests/bpf: Increase xdp data size for arm64 64K page size
authorYonghong Song <yonghong.song@linux.dev>
Fri, 25 Jul 2025 04:34:30 +0000 (21:34 -0700)
committerMartin KaFai Lau <martin.lau@kernel.org>
Sat, 26 Jul 2025 01:20:43 +0000 (18:20 -0700)
With arm64 64K page size, the following 4 subtests failed:
  #97/25   dynptr/test_probe_read_user_dynptr:FAIL
  #97/26   dynptr/test_probe_read_kernel_dynptr:FAIL
  #97/27   dynptr/test_probe_read_user_str_dynptr:FAIL
  #97/28   dynptr/test_probe_read_kernel_str_dynptr:FAIL

These failures are due to function bpf_dynptr_check_off_len() in
include/linux/bpf.h where there is a test
  if (len > size || offset > size - len)
    return -E2BIG;
With 64K page size, the 'offset' is greater than 'size - len',
which caused the test failure.

For 64KB page size, this patch increased the xdp buffer size from 5000 to
90000. The above 4 test failures are fixed as 'size' value is increased.
But it introduced two new failures:
  #97/4    dynptr/test_dynptr_copy_xdp:FAIL
  #97/12   dynptr/test_dynptr_memset_xdp_chunks:FAIL

These two failures will be addressed in subsequent patches.

Signed-off-by: Yonghong Song <yonghong.song@linux.dev>
Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
Acked-by: Mykyta Yatsenko <yatsenko@meta.com>
Link: https://patch.msgid.link/20250725043430.208469-1-yonghong.song@linux.dev
tools/testing/selftests/bpf/prog_tests/dynptr.c

index f2b65398afce8d05577ecac5cd520e0ff386c322..9b2d9ceda2102392b432b2fac658a94fd050fd80 100644 (file)
@@ -51,6 +51,8 @@ static struct {
        {"test_copy_from_user_task_str_dynptr", SETUP_SYSCALL_SLEEP},
 };
 
+#define PAGE_SIZE_64K 65536
+
 static void verify_success(const char *prog_name, enum test_setup_type setup_type)
 {
        char user_data[384] = {[0 ... 382] = 'a', '\0'};
@@ -146,14 +148,18 @@ static void verify_success(const char *prog_name, enum test_setup_type setup_typ
        }
        case SETUP_XDP_PROG:
        {
-               char data[5000];
+               char data[90000];
                int err, prog_fd;
                LIBBPF_OPTS(bpf_test_run_opts, opts,
                            .data_in = &data,
-                           .data_size_in = sizeof(data),
                            .repeat = 1,
                );
 
+               if (getpagesize() == PAGE_SIZE_64K)
+                       opts.data_size_in = sizeof(data);
+               else
+                       opts.data_size_in = 5000;
+
                prog_fd = bpf_program__fd(prog);
                err = bpf_prog_test_run_opts(prog_fd, &opts);