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