selftests/bpf: Add tests for the new type-tag based __arena identifier

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>
This commit is contained in:
Emil Tsalapatis 2026-06-01 20:41:20 -04:00 committed by Alexei Starovoitov
parent 367e6e4a81
commit 9fd5bf96ac

View 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";