perf_event_stackmap.c (1256B)
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 10typedef __u64 stack_trace_t[PERF_MAX_STACK_DEPTH]; 11struct { 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 18struct { 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 25long stackid_kernel = 1; 26long stackid_user = 1; 27long stack_kernel = 1; 28long stack_user = 1; 29 30SEC("perf_event") 31int 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 59char LICENSE[] SEC("license") = "GPL";