1615741d8SStanislav Fomichev // SPDX-License-Identifier: GPL-2.0
2615741d8SStanislav Fomichev #include <test_progs.h>
3615741d8SStanislav Fomichev 
test_stacktrace_map(void)4615741d8SStanislav Fomichev void test_stacktrace_map(void)
5615741d8SStanislav Fomichev {
6615741d8SStanislav Fomichev 	int control_map_fd, stackid_hmap_fd, stackmap_fd, stack_amap_fd;
7a393ea80SKui-Feng Lee 	const char *prog_name = "oncpu";
81bdb3427SAndrii Nakryiko 	int err, prog_fd, stack_trace_len;
9*afef88e6SDaniel Müller 	const char *file = "./test_stacktrace_map.bpf.o";
10615741d8SStanislav Fomichev 	__u32 key, val, duration = 0;
111bdb3427SAndrii Nakryiko 	struct bpf_program *prog;
12615741d8SStanislav Fomichev 	struct bpf_object *obj;
131bdb3427SAndrii Nakryiko 	struct bpf_link *link;
14615741d8SStanislav Fomichev 
15cbdb1461SAndrii Nakryiko 	err = bpf_prog_test_load(file, BPF_PROG_TYPE_TRACEPOINT, &obj, &prog_fd);
16615741d8SStanislav Fomichev 	if (CHECK(err, "prog_load", "err %d errno %d\n", err, errno))
17615741d8SStanislav Fomichev 		return;
18615741d8SStanislav Fomichev 
19a393ea80SKui-Feng Lee 	prog = bpf_object__find_program_by_name(obj, prog_name);
201bdb3427SAndrii Nakryiko 	if (CHECK(!prog, "find_prog", "prog '%s' not found\n", prog_name))
21615741d8SStanislav Fomichev 		goto close_prog;
22615741d8SStanislav Fomichev 
231bdb3427SAndrii Nakryiko 	link = bpf_program__attach_tracepoint(prog, "sched", "sched_switch");
24bad2e478SAndrii Nakryiko 	if (!ASSERT_OK_PTR(link, "attach_tp"))
25615741d8SStanislav Fomichev 		goto close_prog;
26615741d8SStanislav Fomichev 
27615741d8SStanislav Fomichev 	/* find map fds */
28615741d8SStanislav Fomichev 	control_map_fd = bpf_find_map(__func__, obj, "control_map");
29d38835b7SStanislav Fomichev 	if (CHECK_FAIL(control_map_fd < 0))
30615741d8SStanislav Fomichev 		goto disable_pmu;
31615741d8SStanislav Fomichev 
32615741d8SStanislav Fomichev 	stackid_hmap_fd = bpf_find_map(__func__, obj, "stackid_hmap");
33d38835b7SStanislav Fomichev 	if (CHECK_FAIL(stackid_hmap_fd < 0))
34615741d8SStanislav Fomichev 		goto disable_pmu;
35615741d8SStanislav Fomichev 
36615741d8SStanislav Fomichev 	stackmap_fd = bpf_find_map(__func__, obj, "stackmap");
37d38835b7SStanislav Fomichev 	if (CHECK_FAIL(stackmap_fd < 0))
38615741d8SStanislav Fomichev 		goto disable_pmu;
39615741d8SStanislav Fomichev 
40615741d8SStanislav Fomichev 	stack_amap_fd = bpf_find_map(__func__, obj, "stack_amap");
41d38835b7SStanislav Fomichev 	if (CHECK_FAIL(stack_amap_fd < 0))
42615741d8SStanislav Fomichev 		goto disable_pmu;
43615741d8SStanislav Fomichev 
44615741d8SStanislav Fomichev 	/* give some time for bpf program run */
45615741d8SStanislav Fomichev 	sleep(1);
46615741d8SStanislav Fomichev 
47615741d8SStanislav Fomichev 	/* disable stack trace collection */
48615741d8SStanislav Fomichev 	key = 0;
49615741d8SStanislav Fomichev 	val = 1;
50615741d8SStanislav Fomichev 	bpf_map_update_elem(control_map_fd, &key, &val, 0);
51615741d8SStanislav Fomichev 
52615741d8SStanislav Fomichev 	/* for every element in stackid_hmap, we can find a corresponding one
53615741d8SStanislav Fomichev 	 * in stackmap, and vise versa.
54615741d8SStanislav Fomichev 	 */
55615741d8SStanislav Fomichev 	err = compare_map_keys(stackid_hmap_fd, stackmap_fd);
56615741d8SStanislav Fomichev 	if (CHECK(err, "compare_map_keys stackid_hmap vs. stackmap",
57615741d8SStanislav Fomichev 		  "err %d errno %d\n", err, errno))
58d38835b7SStanislav Fomichev 		goto disable_pmu;
59615741d8SStanislav Fomichev 
60615741d8SStanislav Fomichev 	err = compare_map_keys(stackmap_fd, stackid_hmap_fd);
61615741d8SStanislav Fomichev 	if (CHECK(err, "compare_map_keys stackmap vs. stackid_hmap",
62615741d8SStanislav Fomichev 		  "err %d errno %d\n", err, errno))
63d38835b7SStanislav Fomichev 		goto disable_pmu;
64615741d8SStanislav Fomichev 
65615741d8SStanislav Fomichev 	stack_trace_len = PERF_MAX_STACK_DEPTH * sizeof(__u64);
66615741d8SStanislav Fomichev 	err = compare_stack_ips(stackmap_fd, stack_amap_fd, stack_trace_len);
67615741d8SStanislav Fomichev 	if (CHECK(err, "compare_stack_ips stackmap vs. stack_amap",
68615741d8SStanislav Fomichev 		  "err %d errno %d\n", err, errno))
69d38835b7SStanislav Fomichev 		goto disable_pmu;
70615741d8SStanislav Fomichev 
71615741d8SStanislav Fomichev disable_pmu:
721bdb3427SAndrii Nakryiko 	bpf_link__destroy(link);
73615741d8SStanislav Fomichev close_prog:
74615741d8SStanislav Fomichev 	bpf_object__close(obj);
75615741d8SStanislav Fomichev }
76