Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 #include <test_progs.h>
0003 
0004 void test_stacktrace_map(void)
0005 {
0006     int control_map_fd, stackid_hmap_fd, stackmap_fd, stack_amap_fd;
0007     const char *prog_name = "oncpu";
0008     int err, prog_fd, stack_trace_len;
0009     const char *file = "./test_stacktrace_map.o";
0010     __u32 key, val, duration = 0;
0011     struct bpf_program *prog;
0012     struct bpf_object *obj;
0013     struct bpf_link *link;
0014 
0015     err = bpf_prog_test_load(file, BPF_PROG_TYPE_TRACEPOINT, &obj, &prog_fd);
0016     if (CHECK(err, "prog_load", "err %d errno %d\n", err, errno))
0017         return;
0018 
0019     prog = bpf_object__find_program_by_name(obj, prog_name);
0020     if (CHECK(!prog, "find_prog", "prog '%s' not found\n", prog_name))
0021         goto close_prog;
0022 
0023     link = bpf_program__attach_tracepoint(prog, "sched", "sched_switch");
0024     if (!ASSERT_OK_PTR(link, "attach_tp"))
0025         goto close_prog;
0026 
0027     /* find map fds */
0028     control_map_fd = bpf_find_map(__func__, obj, "control_map");
0029     if (CHECK_FAIL(control_map_fd < 0))
0030         goto disable_pmu;
0031 
0032     stackid_hmap_fd = bpf_find_map(__func__, obj, "stackid_hmap");
0033     if (CHECK_FAIL(stackid_hmap_fd < 0))
0034         goto disable_pmu;
0035 
0036     stackmap_fd = bpf_find_map(__func__, obj, "stackmap");
0037     if (CHECK_FAIL(stackmap_fd < 0))
0038         goto disable_pmu;
0039 
0040     stack_amap_fd = bpf_find_map(__func__, obj, "stack_amap");
0041     if (CHECK_FAIL(stack_amap_fd < 0))
0042         goto disable_pmu;
0043 
0044     /* give some time for bpf program run */
0045     sleep(1);
0046 
0047     /* disable stack trace collection */
0048     key = 0;
0049     val = 1;
0050     bpf_map_update_elem(control_map_fd, &key, &val, 0);
0051 
0052     /* for every element in stackid_hmap, we can find a corresponding one
0053      * in stackmap, and vise versa.
0054      */
0055     err = compare_map_keys(stackid_hmap_fd, stackmap_fd);
0056     if (CHECK(err, "compare_map_keys stackid_hmap vs. stackmap",
0057           "err %d errno %d\n", err, errno))
0058         goto disable_pmu;
0059 
0060     err = compare_map_keys(stackmap_fd, stackid_hmap_fd);
0061     if (CHECK(err, "compare_map_keys stackmap vs. stackid_hmap",
0062           "err %d errno %d\n", err, errno))
0063         goto disable_pmu;
0064 
0065     stack_trace_len = PERF_MAX_STACK_DEPTH * sizeof(__u64);
0066     err = compare_stack_ips(stackmap_fd, stack_amap_fd, stack_trace_len);
0067     if (CHECK(err, "compare_stack_ips stackmap vs. stack_amap",
0068           "err %d errno %d\n", err, errno))
0069         goto disable_pmu;
0070 
0071 disable_pmu:
0072     bpf_link__destroy(link);
0073 close_prog:
0074     bpf_object__close(obj);
0075 }