1241519Sattilio// SPDX-License-Identifier: GPL-2.0 2241519Sattilio// Copyright (c) 2020 Facebook 3241519Sattilio#include "vmlinux.h" 4241519Sattilio#include <bpf/bpf_helpers.h> 5241519Sattilio 6241519Sattilio#ifndef PERF_MAX_STACK_DEPTH 7241519Sattilio#define PERF_MAX_STACK_DEPTH 127 8241519Sattilio#endif 9241519Sattilio 10241519Sattiliotypedef __u64 stack_trace_t[PERF_MAX_STACK_DEPTH]; 11241519Sattiliostruct { 12241519Sattilio __uint(type, BPF_MAP_TYPE_STACK_TRACE); 13241519Sattilio __uint(max_entries, 16384); 14241519Sattilio __type(key, __u32); 15241519Sattilio __type(value, stack_trace_t); 16241519Sattilio} stackmap SEC(".maps"); 17241519Sattilio 18241519Sattiliostruct { 19241519Sattilio __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); 20241519Sattilio __uint(max_entries, 1); 21241519Sattilio __type(key, __u32); 22241519Sattilio __type(value, stack_trace_t); 23241519Sattilio} stackdata_map SEC(".maps"); 24241519Sattilio 25241519Sattiliolong stackid_kernel = 1; 26241519Sattiliolong stackid_user = 1; 27241519Sattiliolong stack_kernel = 1; 28241519Sattiliolong stack_user = 1; 29241519Sattilio 30241519SattilioSEC("perf_event") 31241519Sattilioint oncpu(void *ctx) 32241519Sattilio{ 33241519Sattilio stack_trace_t *trace; 34241519Sattilio __u32 key = 0; 35241519Sattilio long val; 36241519Sattilio 37241519Sattilio val = bpf_get_stackid(ctx, &stackmap, 0); 38241519Sattilio if (val >= 0) 39241519Sattilio stackid_kernel = 2; 40241519Sattilio val = bpf_get_stackid(ctx, &stackmap, BPF_F_USER_STACK); 41241519Sattilio if (val >= 0) 42241519Sattilio stackid_user = 2; 43241519Sattilio 44241519Sattilio trace = bpf_map_lookup_elem(&stackdata_map, &key); 45241519Sattilio if (!trace) 46241519Sattilio return 0; 47241519Sattilio 48241519Sattilio val = bpf_get_stack(ctx, trace, sizeof(stack_trace_t), 0); 49241519Sattilio if (val > 0) 50241519Sattilio stack_kernel = 2; 51241519Sattilio 52241519Sattilio val = bpf_get_stack(ctx, trace, sizeof(stack_trace_t), BPF_F_USER_STACK); 53241519Sattilio if (val > 0) 54241519Sattilio stack_user = 2; 55241519Sattilio 56241519Sattilio return 0; 57241519Sattilio} 58241519Sattilio 59241519Sattiliochar LICENSE[] SEC("license") = "GPL"; 60241519Sattilio