1 | // SPDX-License-Identifier: GPL-2.0 |
2 | // Copyright (c) 2020 Facebook |
3 | #include "vmlinux.h" |
4 | #include <bpf/bpf_helpers.h> |
5 | |
6 | #ifndef PERF_MAX_STACK_DEPTH |
7 | #define PERF_MAX_STACK_DEPTH 127 |
8 | #endif |
9 | |
10 | typedef __u64 stack_trace_t[PERF_MAX_STACK_DEPTH]; |
11 | struct { |
12 | __uint(type, BPF_MAP_TYPE_STACK_TRACE); |
13 | __uint(max_entries, 16384); |
14 | __type(key, __u32); |
15 | __type(value, stack_trace_t); |
16 | } stackmap SEC(".maps" ); |
17 | |
18 | struct { |
19 | __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); |
20 | __uint(max_entries, 1); |
21 | __type(key, __u32); |
22 | __type(value, stack_trace_t); |
23 | } stackdata_map SEC(".maps" ); |
24 | |
25 | long stackid_kernel = 1; |
26 | long stackid_user = 1; |
27 | long stack_kernel = 1; |
28 | long stack_user = 1; |
29 | |
30 | SEC("perf_event" ) |
31 | int oncpu(void *ctx) |
32 | { |
33 | stack_trace_t *trace; |
34 | __u32 key = 0; |
35 | long val; |
36 | |
37 | val = bpf_get_stackid(ctx, &stackmap, 0); |
38 | if (val >= 0) |
39 | stackid_kernel = 2; |
40 | val = bpf_get_stackid(ctx, &stackmap, BPF_F_USER_STACK); |
41 | if (val >= 0) |
42 | stackid_user = 2; |
43 | |
44 | trace = bpf_map_lookup_elem(&stackdata_map, &key); |
45 | if (!trace) |
46 | return 0; |
47 | |
48 | val = bpf_get_stack(ctx, trace, sizeof(stack_trace_t), 0); |
49 | if (val > 0) |
50 | stack_kernel = 2; |
51 | |
52 | val = bpf_get_stack(ctx, trace, sizeof(stack_trace_t), BPF_F_USER_STACK); |
53 | if (val > 0) |
54 | stack_user = 2; |
55 | |
56 | return 0; |
57 | } |
58 | |
59 | char LICENSE[] SEC("license" ) = "GPL" ; |
60 | |