xref: /linux/tools/testing/selftests/bpf/prog_tests/libarena_asan.c (revision 5a8cd539ac19f7a68e68e1d25ef9ca2ff55b8500)
1 // SPDX-License-Identifier: LGPL-2.1 OR BSD-2-Clause
2 /* Copyright (c) 2026 Meta Platforms, Inc. and affiliates. */
3 #include <test_progs.h>
4 
5 #ifdef HAS_BPF_ARENA_ASAN
6 #include <unistd.h>
7 
8 #include <libarena/common.h>
9 #include <libarena/asan.h>
10 #include <libarena/buddy.h>
11 #include <libarena/userspace.h>
12 
13 #include "libarena/libarena_asan.skel.h"
14 
run_libarena_asan_test(struct libarena_asan * skel,struct bpf_program * prog,const char * name)15 static void run_libarena_asan_test(struct libarena_asan *skel,
16 		struct bpf_program *prog, const char *name)
17 {
18 	int ret;
19 
20 	if (strstr(name, "test_buddy")) {
21 		/* Buddy tests initialize the allocator directly. */
22 		ret = libarena_run_prog(bpf_program__fd(skel->progs.arena_buddy_destroy));
23 		if (!ASSERT_OK(ret, "arena_buddy_destroy"))
24 			return;
25 	} else {
26 		ret = libarena_run_prog(bpf_program__fd(skel->progs.arena_buddy_reset));
27 		if (!ASSERT_OK(ret, "arena_buddy_reset"))
28 			return;
29 	}
30 
31 	ret = libarena_run_prog(bpf_program__fd(prog));
32 	ASSERT_OK(ret, name);
33 
34 	verify_test_stderr(skel->obj, prog);
35 }
36 
run_test(void)37 static void run_test(void)
38 {
39 	struct arena_alloc_reserve_args args;
40 	struct libarena_asan *skel;
41 	struct bpf_program *prog;
42 	int ret;
43 
44 	skel = libarena_asan__open_and_load();
45 	if (!ASSERT_OK_PTR(skel, "open_and_load"))
46 		return;
47 
48 	ret = libarena_asan__attach(skel);
49 	if (!ASSERT_OK(ret, "attach"))
50 		goto out;
51 
52 	args.nr_pages = ARENA_RESERVE_PAGES_DFL;
53 
54 	ret = libarena_run_prog_args(bpf_program__fd(skel->progs.arena_alloc_reserve),
55 			&args, sizeof(args));
56 	if (!ASSERT_OK(ret, "arena_alloc_reserve"))
57 		goto out;
58 
59 	ret = libarena_asan_init(
60 		bpf_program__fd(skel->progs.arena_get_info),
61 		bpf_program__fd(skel->progs.asan_init),
62 		(1ULL << 32) / sysconf(_SC_PAGESIZE));
63 	if (!ASSERT_OK(ret, "libarena_asan_init"))
64 		goto out;
65 
66 	bpf_object__for_each_program(prog, skel->obj) {
67 		const char *name = bpf_program__name(prog);
68 
69 		if (!libarena_is_asan_test_prog(name))
70 			continue;
71 
72 		if (!test__start_subtest(name))
73 			continue;
74 
75 		run_libarena_asan_test(skel, prog, name);
76 	}
77 
78 out:
79 	libarena_asan__destroy(skel);
80 }
81 
82 #endif /* HAS_BPF_ARENA_ASAN */
83 
84 /*
85  * Run the test depending on whether LLVM can compile arena ASAN
86  * programs.
87  */
serial_test_libarena_asan(void)88 void serial_test_libarena_asan(void)
89 {
90 #ifdef HAS_BPF_ARENA_ASAN
91 	run_test();
92 #else
93 	test__skip();
94 #endif
95 
96 	return;
97 }
98