]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
selftests/bpf: Explicitly account for globals in verifier_arena_large
authorEmil Tsalapatis <emil@etsalapatis.com>
Tue, 16 Dec 2025 17:33:21 +0000 (12:33 -0500)
committerAndrii Nakryiko <andrii@kernel.org>
Tue, 16 Dec 2025 18:42:55 +0000 (10:42 -0800)
The big_alloc1 test in verifier_arena_large assumes that the arena base
and the first page allocated by bpf_arena_alloc_pages are identical.
This is not the case, because the first page in the arena is populated
by global arena data. The test still passes because the code makes the
tacit assumption that the first page is on offset PAGE_SIZE instead of
0.

Make this distinction explicit in the code, and adjust the page offsets
requested during the test to count from the beginning of the arena
instead of using the address of the first allocated page.

Signed-off-by: Emil Tsalapatis <emil@etsalapatis.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Reviewed-by: Eduard Zingerman <eddyz87@gmail.com>
Link: https://lore.kernel.org/bpf/20251216173325.98465-2-emil@etsalapatis.com
tools/testing/selftests/bpf/progs/verifier_arena_large.c

index f19e15400b3e104434d17002274cf7dc72d3f2da..bd430a34c3ab4d1f48cb5afbdb3321ac4a2b9dcc 100644 (file)
@@ -23,18 +23,25 @@ int big_alloc1(void *ctx)
 {
 #if defined(__BPF_FEATURE_ADDR_SPACE_CAST)
        volatile char __arena *page1, *page2, *no_page, *page3;
-       void __arena *base;
+       u64 base;
 
-       page1 = base = bpf_arena_alloc_pages(&arena, NULL, 1, NUMA_NO_NODE, 0);
+       base = (u64)arena_base(&arena);
+
+       page1 = bpf_arena_alloc_pages(&arena, NULL, 1, NUMA_NO_NODE, 0);
        if (!page1)
                return 1;
+
+       /* Account for global arena data. */
+       if ((u64)page1 != base + PAGE_SIZE)
+               return 15;
+
        *page1 = 1;
-       page2 = bpf_arena_alloc_pages(&arena, base + ARENA_SIZE - PAGE_SIZE * 2,
+       page2 = bpf_arena_alloc_pages(&arena, (void __arena *)(ARENA_SIZE - PAGE_SIZE),
                                      1, NUMA_NO_NODE, 0);
        if (!page2)
                return 2;
        *page2 = 2;
-       no_page = bpf_arena_alloc_pages(&arena, base + ARENA_SIZE - PAGE_SIZE,
+       no_page = bpf_arena_alloc_pages(&arena, (void __arena *)ARENA_SIZE,
                                        1, NUMA_NO_NODE, 0);
        if (no_page)
                return 3;