Skip to content

Commit 679166b

Browse files
authored
libbpf-tools/numamove: Add folio support (#4955)
In [0] kernel commit 73eab3ca481e ("mm: migrate: convert migrate_misplaced_page() to migrate_misplaced_folio()") convert migrate_misplaced_page() to migrate_misplaced_folio(). Kernel version: $ git describe 73eab3ca481e5be0f1fd8140365d604482f84ee1 v6.6-rc4-109-g73eab3ca481e [0] torvalds/linux@73eab3ca481e Signed-off-by: Rong Tao <[email protected]>
1 parent c50db02 commit 679166b

File tree

2 files changed

+57
-11
lines changed

2 files changed

+57
-11
lines changed

libbpf-tools/numamove.bpf.c

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ struct {
1414
__u64 latency = 0;
1515
__u64 num = 0;
1616

17-
static int __migrate_misplaced_page(void)
17+
static int __migrate_misplaced(void)
1818
{
1919
u32 pid = bpf_get_current_pid_tgid();
2020
u64 ts = bpf_ktime_get_ns();
@@ -26,16 +26,28 @@ static int __migrate_misplaced_page(void)
2626
SEC("fentry/migrate_misplaced_page")
2727
int BPF_PROG(fentry_migrate_misplaced_page)
2828
{
29-
return __migrate_misplaced_page();
29+
return __migrate_misplaced();
30+
}
31+
32+
SEC("fentry/migrate_misplaced_folio")
33+
int BPF_PROG(fentry_migrate_misplaced_folio)
34+
{
35+
return __migrate_misplaced();
3036
}
3137

3238
SEC("kprobe/migrate_misplaced_page")
3339
int BPF_PROG(kprobe_migrate_misplaced_page)
3440
{
35-
return __migrate_misplaced_page();
41+
return __migrate_misplaced();
42+
}
43+
44+
SEC("kprobe/migrate_misplaced_folio")
45+
int BPF_PROG(kprobe_migrate_misplaced_folio)
46+
{
47+
return __migrate_misplaced();
3648
}
3749

38-
static int __migrate_misplaced_page_exit(void)
50+
static int __migrate_misplaced_exit(void)
3951
{
4052
u32 pid = bpf_get_current_pid_tgid();
4153
u64 *tsp, ts = bpf_ktime_get_ns();
@@ -58,13 +70,25 @@ static int __migrate_misplaced_page_exit(void)
5870
SEC("fexit/migrate_misplaced_page")
5971
int BPF_PROG(fexit_migrate_misplaced_page_exit)
6072
{
61-
return __migrate_misplaced_page_exit();
73+
return __migrate_misplaced_exit();
74+
}
75+
76+
SEC("fexit/migrate_misplaced_folio")
77+
int BPF_PROG(fexit_migrate_misplaced_folio_exit)
78+
{
79+
return __migrate_misplaced_exit();
6280
}
6381

6482
SEC("kretprobe/migrate_misplaced_page")
6583
int BPF_PROG(kretprobe_migrate_misplaced_page_exit)
6684
{
67-
return __migrate_misplaced_page_exit();
85+
return __migrate_misplaced_exit();
86+
}
87+
88+
SEC("kretprobe/migrate_misplaced_folio")
89+
int BPF_PROG(kretprobe_migrate_misplaced_folio_exit)
90+
{
91+
return __migrate_misplaced_exit();
6892
}
6993

7094
char LICENSE[] SEC("license") = "GPL";

libbpf-tools/numamove.c

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44
// Based on numamove(8) from BPF-Perf-Tools-Book by Brendan Gregg.
55
// 8-Jun-2020 Wenbo Zhang Created this.
66
// 30-Jan-2023 Rong Tao Use fentry_can_attach() to decide use fentry/kprobe.
7+
// 06-Apr-2024 Rong Tao Support migrate_misplaced_folio()
78
#include <argp.h>
89
#include <signal.h>
10+
#include <stdbool.h>
911
#include <stdio.h>
1012
#include <unistd.h>
1113
#include <time.h>
@@ -76,6 +78,7 @@ int main(int argc, char **argv)
7678
char ts[32];
7779
time_t t;
7880
int err;
81+
bool use_folio, use_fentry;
7982

8083
err = argp_parse(&argp, argc, argv, 0, NULL, NULL);
8184
if (err)
@@ -95,14 +98,33 @@ int main(int argc, char **argv)
9598
}
9699

97100
/* It fallbacks to kprobes when kernel does not support fentry. */
98-
if (fentry_can_attach("migrate_misplaced_page", NULL)) {
99-
bpf_program__set_autoload(obj->progs.kprobe_migrate_misplaced_page, false);
100-
bpf_program__set_autoload(obj->progs.kretprobe_migrate_misplaced_page_exit, false);
101+
if (fentry_can_attach("migrate_misplaced_folio", NULL)) {
102+
use_fentry = true;
103+
use_folio = true;
104+
} else if (kprobe_exists("migrate_misplaced_folio")) {
105+
use_fentry = false;
106+
use_folio = true;
107+
} else if (fentry_can_attach("migrate_misplaced_page", NULL)) {
108+
use_fentry = true;
109+
use_folio = false;
110+
} else if (kprobe_exists("migrate_misplaced_page")) {
111+
use_fentry = false;
112+
use_folio = false;
101113
} else {
102-
bpf_program__set_autoload(obj->progs.fentry_migrate_misplaced_page, false);
103-
bpf_program__set_autoload(obj->progs.fexit_migrate_misplaced_page_exit, false);
114+
fprintf(stderr, "can't found any fentry/kprobe of migrate misplaced folio/page\n");
115+
return 1;
104116
}
105117

118+
bpf_program__set_autoload(obj->progs.fentry_migrate_misplaced_folio, (use_fentry && use_folio));
119+
bpf_program__set_autoload(obj->progs.fexit_migrate_misplaced_folio_exit, (use_fentry && use_folio));
120+
bpf_program__set_autoload(obj->progs.kprobe_migrate_misplaced_folio, (!use_fentry && use_folio));
121+
bpf_program__set_autoload(obj->progs.kretprobe_migrate_misplaced_folio_exit, (!use_fentry && use_folio));
122+
123+
bpf_program__set_autoload(obj->progs.fentry_migrate_misplaced_page, (use_fentry && !use_folio));
124+
bpf_program__set_autoload(obj->progs.fexit_migrate_misplaced_page_exit, (use_fentry && !use_folio));
125+
bpf_program__set_autoload(obj->progs.kprobe_migrate_misplaced_page, (!use_fentry && !use_folio));
126+
bpf_program__set_autoload(obj->progs.kretprobe_migrate_misplaced_page_exit, (!use_fentry && !use_folio));
127+
106128
err = numamove_bpf__load(obj);
107129
if (err) {
108130
fprintf(stderr, "failed to load BPF skelect: %d\n", err);

0 commit comments

Comments
 (0)