lcc/clcc/remote/config_map/config_map.bpf.c (31 lines of code) (raw):
#include "lbc.h"
#define TASK_COMM_LEN 16
struct data_t {
u32 c_pid;
u32 p_pid;
char c_comm[TASK_COMM_LEN];
char p_comm[TASK_COMM_LEN];
};
LBC_PERF_OUTPUT(e_out, struct data_t, 128);
LBC_HASH(user_config, u32, u32, 1024);
SEC("kprobe/wake_up_new_task")
int j_wake_up_new_task(struct pt_regs *ctx)
{
struct task_struct* parent = (struct task_struct *)PT_REGS_PARM1(ctx);
u32 pid = BPF_CORE_READ(parent, pid);
u32 key = 0;
u32 *pidp;
pidp = bpf_map_lookup_elem(&user_config, &key);
if (pidp) {
if (*pidp == pid) {
struct data_t data = {};
data.c_pid = bpf_get_current_pid_tgid() >> 32;
bpf_get_current_comm(&data.c_comm, TASK_COMM_LEN);
data.p_pid = BPF_CORE_READ(parent, pid);
bpf_core_read(&data.p_comm[0], TASK_COMM_LEN, &parent->comm[0]);
bpf_perf_event_output(ctx, &e_out, BPF_F_CURRENT_CPU, &data, sizeof(data));
}
}
return 0;
}
char _license[] SEC("license") = "GPL";