0001
0002
0003 #include "vmlinux.h"
0004 #include <bpf/bpf_helpers.h>
0005
0006 #ifndef PERF_MAX_STACK_DEPTH
0007 #define PERF_MAX_STACK_DEPTH 127
0008 #endif
0009
0010 typedef __u64 stack_trace_t[PERF_MAX_STACK_DEPTH];
0011 struct {
0012 __uint(type, BPF_MAP_TYPE_STACK_TRACE);
0013 __uint(max_entries, 16384);
0014 __type(key, __u32);
0015 __type(value, stack_trace_t);
0016 } stackmap SEC(".maps");
0017
0018 struct {
0019 __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
0020 __uint(max_entries, 1);
0021 __type(key, __u32);
0022 __type(value, stack_trace_t);
0023 } stackdata_map SEC(".maps");
0024
0025 long stackid_kernel = 1;
0026 long stackid_user = 1;
0027 long stack_kernel = 1;
0028 long stack_user = 1;
0029
0030 SEC("perf_event")
0031 int oncpu(void *ctx)
0032 {
0033 stack_trace_t *trace;
0034 __u32 key = 0;
0035 long val;
0036
0037 val = bpf_get_stackid(ctx, &stackmap, 0);
0038 if (val >= 0)
0039 stackid_kernel = 2;
0040 val = bpf_get_stackid(ctx, &stackmap, BPF_F_USER_STACK);
0041 if (val >= 0)
0042 stackid_user = 2;
0043
0044 trace = bpf_map_lookup_elem(&stackdata_map, &key);
0045 if (!trace)
0046 return 0;
0047
0048 val = bpf_get_stack(ctx, trace, sizeof(stack_trace_t), 0);
0049 if (val > 0)
0050 stack_kernel = 2;
0051
0052 val = bpf_get_stack(ctx, trace, sizeof(stack_trace_t), BPF_F_USER_STACK);
0053 if (val > 0)
0054 stack_user = 2;
0055
0056 return 0;
0057 }
0058
0059 char LICENSE[] SEC("license") = "GPL";