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 __uint(key_size, sizeof(__u32)); 15 __uint(value_size, sizeof(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