xref: /aosp_15_r20/external/bcc/libbpf-tools/numamove.bpf.c (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
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