xref: /linux/tools/testing/selftests/bpf/prog_tests/stacktrace_map.c (revision 92d33063c081a82d25dd08a9cce03947c8ed9164)
1  // SPDX-License-Identifier: GPL-2.0
2  #include <test_progs.h>
3  
4  void test_stacktrace_map(void)
5  {
6  	int control_map_fd, stackid_hmap_fd, stackmap_fd, stack_amap_fd;
7  	const char *prog_name = "oncpu";
8  	int err, prog_fd, stack_trace_len;
9  	const char *file = "./test_stacktrace_map.bpf.o";
10  	__u32 key, val, duration = 0;
11  	struct bpf_program *prog;
12  	struct bpf_object *obj;
13  	struct bpf_link *link;
14  
15  	err = bpf_prog_test_load(file, BPF_PROG_TYPE_TRACEPOINT, &obj, &prog_fd);
16  	if (CHECK(err, "prog_load", "err %d errno %d\n", err, errno))
17  		return;
18  
19  	prog = bpf_object__find_program_by_name(obj, prog_name);
20  	if (CHECK(!prog, "find_prog", "prog '%s' not found\n", prog_name))
21  		goto close_prog;
22  
23  	link = bpf_program__attach_tracepoint(prog, "sched", "sched_switch");
24  	if (!ASSERT_OK_PTR(link, "attach_tp"))
25  		goto close_prog;
26  
27  	/* find map fds */
28  	control_map_fd = bpf_find_map(__func__, obj, "control_map");
29  	if (CHECK_FAIL(control_map_fd < 0))
30  		goto disable_pmu;
31  
32  	stackid_hmap_fd = bpf_find_map(__func__, obj, "stackid_hmap");
33  	if (CHECK_FAIL(stackid_hmap_fd < 0))
34  		goto disable_pmu;
35  
36  	stackmap_fd = bpf_find_map(__func__, obj, "stackmap");
37  	if (CHECK_FAIL(stackmap_fd < 0))
38  		goto disable_pmu;
39  
40  	stack_amap_fd = bpf_find_map(__func__, obj, "stack_amap");
41  	if (CHECK_FAIL(stack_amap_fd < 0))
42  		goto disable_pmu;
43  
44  	/* give some time for bpf program run */
45  	sleep(1);
46  
47  	/* disable stack trace collection */
48  	key = 0;
49  	val = 1;
50  	bpf_map_update_elem(control_map_fd, &key, &val, 0);
51  
52  	/* for every element in stackid_hmap, we can find a corresponding one
53  	 * in stackmap, and vise versa.
54  	 */
55  	err = compare_map_keys(stackid_hmap_fd, stackmap_fd);
56  	if (CHECK(err, "compare_map_keys stackid_hmap vs. stackmap",
57  		  "err %d errno %d\n", err, errno))
58  		goto disable_pmu;
59  
60  	err = compare_map_keys(stackmap_fd, stackid_hmap_fd);
61  	if (CHECK(err, "compare_map_keys stackmap vs. stackid_hmap",
62  		  "err %d errno %d\n", err, errno))
63  		goto disable_pmu;
64  
65  	stack_trace_len = PERF_MAX_STACK_DEPTH * sizeof(__u64);
66  	err = compare_stack_ips(stackmap_fd, stack_amap_fd, stack_trace_len);
67  	if (CHECK(err, "compare_stack_ips stackmap vs. stack_amap",
68  		  "err %d errno %d\n", err, errno))
69  		goto disable_pmu;
70  
71  disable_pmu:
72  	bpf_link__destroy(link);
73  close_prog:
74  	bpf_object__close(obj);
75  }
76