From a976940d5c7955aa2aa5ff71610199315e36cef7 Mon Sep 17 00:00:00 2001 From: Wenbo Zhang Date: Sat, 6 Feb 2021 18:27:53 +0800 Subject: [PATCH] libbpf-tools: fix readahead, support v5.10+ kernel Signed-off-by: Wenbo Zhang --- libbpf-tools/readahead.bpf.c | 8 ++++---- libbpf-tools/readahead.c | 39 ++++++++++++++++++++++++++++++++++-- 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/libbpf-tools/readahead.bpf.c b/libbpf-tools/readahead.bpf.c index 4f4e5eee93db..92b2831e5c15 100644 --- a/libbpf-tools/readahead.bpf.c +++ b/libbpf-tools/readahead.bpf.c @@ -26,8 +26,8 @@ struct { static struct hist hist; -SEC("fentry/__do_page_cache_readahead") -int BPF_PROG(do_page_cache_readahead) +SEC("fentry/do_page_cache_ra") +int BPF_PROG(do_page_cache_ra) { u32 pid = bpf_get_current_pid_tgid(); u64 one = 1; @@ -53,8 +53,8 @@ int BPF_PROG(page_cache_alloc_ret, gfp_t gfp, struct page *ret) return 0; } -SEC("fexit/__do_page_cache_readahead") -int BPF_PROG(do_page_cache_readahead_ret) +SEC("fexit/do_page_cache_ra") +int BPF_PROG(do_page_cache_ra_ret) { u32 pid = bpf_get_current_pid_tgid(); diff --git a/libbpf-tools/readahead.c b/libbpf-tools/readahead.c index f2460af8bbd3..1b29b50f75e4 100644 --- a/libbpf-tools/readahead.c +++ b/libbpf-tools/readahead.c @@ -72,6 +72,24 @@ static void sig_handler(int sig) exiting = true; } +static int readahead__set_attach_target(struct bpf_program *prog) +{ + int err; + + err = bpf_program__set_attach_target(prog, 0, "do_page_cache_ra"); + if (!err) + return 0; + + err = bpf_program__set_attach_target(prog, 0, + "__do_page_cache_readahead"); + if (!err) + return 0; + + fprintf(stderr, "failed to set attach target to %s: %s\n", + bpf_program__section_name(prog), strerror(-err)); + return err; +} + int main(int argc, char **argv) { static const struct argp argp = { @@ -95,12 +113,29 @@ int main(int argc, char **argv) return 1; } - obj = readahead_bpf__open_and_load(); + obj = readahead_bpf__open(); if (!obj) { - fprintf(stderr, "failed to open and/or load BPF ojbect\n"); + fprintf(stderr, "failed to open BPF object\n"); return 1; } + /* + * Starting from v5.10-rc1 (8238287), __do_page_cache_readahead has + * renamed to do_page_cache_ra. So we specify the function dynamically. + */ + err = readahead__set_attach_target(obj->progs.do_page_cache_ra); + if (err) + goto cleanup; + err = readahead__set_attach_target(obj->progs.do_page_cache_ra_ret); + if (err) + goto cleanup; + + err = readahead_bpf__load(obj); + if (err) { + fprintf(stderr, "failed to load BPF object\n"); + goto cleanup; + } + err = readahead_bpf__attach(obj); if (err) { fprintf(stderr, "failed to attach BPF programs\n");