1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright (c) 2020 Wenbo Zhang
3 #include <vmlinux.h>
4 #include <bpf/bpf_helpers.h>
5 #include <bpf/bpf_tracing.h>
6
7 struct {
8 __uint(type, BPF_MAP_TYPE_HASH);
9 __uint(max_entries, 10240);
10 __type(key, u32);
11 __type(value, u64);
12 } start SEC(".maps");
13
14 __u64 latency = 0;
15 __u64 num = 0;
16
__migrate_misplaced_page(void)17 static int __migrate_misplaced_page(void)
18 {
19 u32 pid = bpf_get_current_pid_tgid();
20 u64 ts = bpf_ktime_get_ns();
21
22 bpf_map_update_elem(&start, &pid, &ts, 0);
23 return 0;
24 }
25
26 SEC("fentry/migrate_misplaced_page")
BPF_PROG(fentry_migrate_misplaced_page)27 int BPF_PROG(fentry_migrate_misplaced_page)
28 {
29 return __migrate_misplaced_page();
30 }
31
32 SEC("kprobe/migrate_misplaced_page")
BPF_PROG(kprobe_migrate_misplaced_page)33 int BPF_PROG(kprobe_migrate_misplaced_page)
34 {
35 return __migrate_misplaced_page();
36 }
37
__migrate_misplaced_page_exit(void)38 static int __migrate_misplaced_page_exit(void)
39 {
40 u32 pid = bpf_get_current_pid_tgid();
41 u64 *tsp, ts = bpf_ktime_get_ns();
42 s64 delta;
43
44 tsp = bpf_map_lookup_elem(&start, &pid);
45 if (!tsp)
46 return 0;
47 delta = (s64)(ts - *tsp);
48 if (delta < 0)
49 goto cleanup;
50 __sync_fetch_and_add(&latency, delta / 1000000U);
51 __sync_fetch_and_add(&num, 1);
52
53 cleanup:
54 bpf_map_delete_elem(&start, &pid);
55 return 0;
56 }
57
58 SEC("fexit/migrate_misplaced_page")
BPF_PROG(fexit_migrate_misplaced_page_exit)59 int BPF_PROG(fexit_migrate_misplaced_page_exit)
60 {
61 return __migrate_misplaced_page_exit();
62 }
63
64 SEC("kretprobe/migrate_misplaced_page")
BPF_PROG(kretprobe_migrate_misplaced_page_exit)65 int BPF_PROG(kretprobe_migrate_misplaced_page_exit)
66 {
67 return __migrate_misplaced_page_exit();
68 }
69
70 char LICENSE[] SEC("license") = "GPL";
71