diff --git a/src/drsnoop/drsnoop.bpf.c b/src/drsnoop/drsnoop.bpf.c index e0eaf0875f2f217a34c4d7922569b0dcbc4dd8a9..87054a76c26ddd47e00e1d9a82e98e91924e6cc6 100644 --- a/src/drsnoop/drsnoop.bpf.c +++ b/src/drsnoop/drsnoop.bpf.c @@ -49,3 +49,42 @@ static int handle_direct_reclaim_begin() bpf_map_update_elem(&start, &pid, &piddata, BPF_ANY); return 0; } + +static int handle_direct_reclaim_end(void *ctx, unsigned long nr_reclaimed) +{ + u64 id = bpf_get_current_pid_tgid(); + struct piddata *piddatap; + struct event event = {}; + u32 tgid = id >> 32; + u32 pid = id; + s64 delta_ns; + + if (target_tgid && target_tgid != tgid) + return 0; + + if (target_pid && target_pid != pid) + return 0; + + /* fetch timestamp and calculate delta */ + piddatap = bpf_map_lookup_elem(&start, &pid); + if (!piddatap) + return 0; + + delta_ns = bpf_ktime_get_ns() - piddatap->ts; + if (delta_ns < 0) + return 0; + + event.pid = pid; + event.nr_reclaimed = nr_reclaimed; + event.delta_ns = delta_ns; + event.nr_free_pages = piddatap->nr_free_pages; + bpf_get_current_comm(&event.task, TASK_COMM_LEN); + + /* output */ + bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, + &event, sizeof(event)); + +cleanup: + bpf_map_delete_elem(&start, &pid); + return 0; +}