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