]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
selftests/bpf: Add tests for the new type-tag based __arena identifier
authorEmil Tsalapatis <emil@etsalapatis.com>
Tue, 2 Jun 2026 00:41:20 +0000 (20:41 -0400)
committerAlexei Starovoitov <ast@kernel.org>
Tue, 2 Jun 2026 01:42:34 +0000 (18:42 -0700)
Add selftests that combine the new type-based __arena identifier with
the volatile qualifier both in functions' arguments and return values.
This way we test both that they are recognized as arena arguments and
that they are not sensitive to the position they are placed in the type
compared to other qualifiers.

Signed-off-by: Emil Tsalapatis <emil@etsalapatis.com>
Link: https://lore.kernel.org/r/20260602004120.17087-7-emil@etsalapatis.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/progs/verifier_arena.c

index 89d72c8d756ac78cc6871d158e21164ad70baa20..df0e22d1a29b1200ac757d3c2847f80427a9e5fe 100644 (file)
@@ -607,4 +607,71 @@ int non_arena_ptr_add_to_arena_ptr(void *ctx)
 
 #endif
 
+static __noinline
+u32 __arena *check_arena_arg_nonglobal(u32 __arena *arg)
+{
+       volatile u32 val = *arg;
+
+       *arg = val + 1;
+
+       return arg;
+}
+
+__weak
+u32 __arena *check_arena_arg_global(u32 __arena *arg)
+{
+       volatile u32 val = *arg;
+
+       *arg = val + 1;
+
+       return arg;
+}
+
+__weak
+u32 volatile __arena *check_arena_arg_quals1(u32 volatile __arena *arg1, u32 __arena volatile *arg2)
+{
+       *arg1 = *arg1 + 1;
+       *arg2 = *arg1 + 1;
+
+       return arg2;
+}
+
+__weak
+u32 __arena volatile *check_arena_arg_quals2(u32 volatile __arena *arg1, u32 __arena volatile *arg2)
+{
+       *arg1 = *arg1 + 1;
+       *arg2 = *arg2 + 1;
+
+       return arg2;
+}
+
+SEC("syscall")
+__success __retval(0)
+int check_arena_arg_ret(void *ctx)
+{
+       u32 __arena *page = bpf_arena_alloc_pages(&arena, NULL, 1, NUMA_NO_NODE, 0);
+       u32 __arena *arg = page;
+       u32 __arena volatile *arg1;
+       u32 __arena volatile *ret1;
+       u32 volatile __arena *arg2;
+       u32 volatile __arena *ret2;
+
+       if (!arg)
+               return 1;
+
+       /* Make sure we use {arg, ret}{1, 2}. */
+
+       arg = check_arena_arg_nonglobal(page);
+       arg = check_arena_arg_global(arg);
+
+       arg1 = arg2 = page;
+       ret1 = check_arena_arg_quals1(arg1, arg2);
+       ret2 = check_arena_arg_quals2(arg1, arg2);
+
+       if (!(*ret1 ||*ret2))
+               return -EINVAL;
+
+       return 0;
+}
+
 char _license[] SEC("license") = "GPL";