// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause /* Copyright (c) 2022 Meta Platforms, Inc. */ #include "vmlinux.h" #include #include #include #include "profile.h" char LICENSE[] SEC("license") = "Dual BSD/GPL"; struct { __uint(type, BPF_MAP_TYPE_RINGBUF); __uint(max_entries, 256 * 1024); } events SEC(".maps"); SEC("perf_event") int profile(void *ctx) { int pid = bpf_get_current_pid_tgid() >> 32; int cpu_id = bpf_get_smp_processor_id(); struct stacktrace_event *event; int cp; event = bpf_ringbuf_reserve(&events, sizeof(*event), 0); if (!event) return 1; event->pid = pid; event->cpu_id = cpu_id; if (bpf_get_current_comm(event->comm, sizeof(event->comm))) event->comm[0] = 0; event->kstack_sz = bpf_get_stack(ctx, event->kstack, sizeof(event->kstack), 0); event->ustack_sz = bpf_get_stack(ctx, event->ustack, sizeof(event->ustack), BPF_F_USER_STACK); bpf_ringbuf_submit(event, 0); return 0; }