1 // SPDX-License-Identifier: GPL-2.0 2 #include <test_progs.h> 3 #include "stacktrace_map.skel.h" 4 5 void test_stacktrace_map(void) 6 { 7 struct stacktrace_map *skel; 8 int control_map_fd, stackid_hmap_fd, stackmap_fd, stack_amap_fd; 9 int err, stack_trace_len; 10 __u32 key, val, stack_id, duration = 0; 11 __u64 stack[PERF_MAX_STACK_DEPTH]; 12 13 skel = stacktrace_map__open_and_load(); 14 if (!ASSERT_OK_PTR(skel, "skel_open_and_load")) 15 return; 16 17 control_map_fd = bpf_map__fd(skel->maps.control_map); 18 stackid_hmap_fd = bpf_map__fd(skel->maps.stackid_hmap); 19 stackmap_fd = bpf_map__fd(skel->maps.stackmap); 20 stack_amap_fd = bpf_map__fd(skel->maps.stack_amap); 21 22 err = stacktrace_map__attach(skel); 23 if (!ASSERT_OK(err, "skel_attach")) 24 goto out; 25 /* give some time for bpf program run */ 26 sleep(1); 27 28 /* disable stack trace collection */ 29 key = 0; 30 val = 1; 31 bpf_map_update_elem(control_map_fd, &key, &val, 0); 32 33 /* for every element in stackid_hmap, we can find a corresponding one 34 * in stackmap, and vice versa. 35 */ 36 err = compare_map_keys(stackid_hmap_fd, stackmap_fd); 37 if (CHECK(err, "compare_map_keys stackid_hmap vs. stackmap", 38 "err %d errno %d\n", err, errno)) 39 goto out; 40 41 err = compare_map_keys(stackmap_fd, stackid_hmap_fd); 42 if (CHECK(err, "compare_map_keys stackmap vs. stackid_hmap", 43 "err %d errno %d\n", err, errno)) 44 goto out; 45 46 stack_trace_len = PERF_MAX_STACK_DEPTH * sizeof(__u64); 47 err = compare_stack_ips(stackmap_fd, stack_amap_fd, stack_trace_len); 48 if (CHECK(err, "compare_stack_ips stackmap vs. stack_amap", 49 "err %d errno %d\n", err, errno)) 50 goto out; 51 52 stack_id = skel->bss->stack_id; 53 err = bpf_map_lookup_and_delete_elem(stackmap_fd, &stack_id, stack); 54 if (!ASSERT_OK(err, "lookup and delete target stack_id")) 55 goto out; 56 57 err = bpf_map_lookup_elem(stackmap_fd, &stack_id, stack); 58 if (!ASSERT_EQ(err, -ENOENT, "lookup deleted stack_id")) 59 goto out; 60 out: 61 stacktrace_map__destroy(skel); 62 } 63