From c4e9f3757fe7079ada51bf33994c9c250987dad8 Mon Sep 17 00:00:00 2001 From: wubijie Date: Mon, 3 Jul 2023 10:23:01 +0800 Subject: [PATCH] track the end of direct memory reclaim in a kernel-mode driver --- src/drsnoop/drsnoop.bpf.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/drsnoop/drsnoop.bpf.c b/src/drsnoop/drsnoop.bpf.c index e0eaf087..87054a76 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; +} -- Gitee