Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 // Copyright (c) 2020 Facebook
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";