Skip to content

Commit

Permalink
libbpf-tools: Add CO-RE profile
Browse files Browse the repository at this point in the history
Convert BCC profile to BPF CO-RE version

Signed-off-by: Eunseon Lee <[email protected]>
  • Loading branch information
ekyooo committed Jan 5, 2024
1 parent d9645f8 commit 30592ea
Show file tree
Hide file tree
Showing 5 changed files with 733 additions and 0 deletions.
1 change: 1 addition & 0 deletions libbpf-tools/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
/offcputime
/oomkill
/opensnoop
/profile
/readahead
/runqlat
/runqlen
Expand Down
1 change: 1 addition & 0 deletions libbpf-tools/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ APPS = \
numamove \
offcputime \
oomkill \
profile \
readahead \
runqlat \
runqlen \
Expand Down
66 changes: 66 additions & 0 deletions libbpf-tools/profile.bpf.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/* Copyright (c) 2022 LG Electronics */
#include <vmlinux.h>
#include <bpf/bpf_helpers.h>
#include <bpf/bpf_core_read.h>
#include <bpf/bpf_tracing.h>
#include "profile.h"
#include "maps.bpf.h"

const volatile bool kernel_stacks_only = false;
const volatile bool user_stacks_only = false;
const volatile bool include_idle = false;
const volatile pid_t targ_pid = -1;
const volatile pid_t targ_tid = -1;

struct {
__uint(type, BPF_MAP_TYPE_STACK_TRACE);
__type(key, u32);
} stackmap SEC(".maps");

struct {
__uint(type, BPF_MAP_TYPE_HASH);
__type(key, struct key_t);
__type(value, u64);
__uint(max_entries, MAX_ENTRIES);
} counts SEC(".maps");

SEC("perf_event")
int do_perf_event(struct bpf_perf_event_data *ctx)
{
u64 id = bpf_get_current_pid_tgid();
u32 pid = id >> 32;
u32 tid = id;
u64 *valp;
static const u64 zero;
struct key_t key = {};

if (!include_idle && tid == 0)
return 0;

if (targ_pid != -1 && targ_pid != pid)
return 0;
if (targ_tid != -1 && targ_tid != tid)
return 0;

key.pid = pid;
bpf_get_current_comm(&key.name, sizeof(key.name));

if (user_stacks_only)
key.kern_stack_id = -1;
else
key.kern_stack_id = bpf_get_stackid(&ctx->regs, &stackmap, 0);

if (kernel_stacks_only)
key.user_stack_id = -1;
else
key.user_stack_id = bpf_get_stackid(&ctx->regs, &stackmap, BPF_F_USER_STACK);

valp = bpf_map_lookup_or_try_init(&counts, &key, &zero);
if (valp)
__sync_fetch_and_add(valp, 1);

return 0;
}

char LICENSE[] SEC("license") = "GPL";
Loading

0 comments on commit 30592ea

Please sign in to comment.