From 94745d1dc85fe99220a5965750c16924c5196c9b Mon Sep 17 00:00:00 2001 From: Hengqi Chen Date: Sat, 11 Dec 2021 16:27:11 +0800 Subject: [PATCH] libbpf-tools: Fix cachestat with kernel 5.15 The tool cachestat is broken on kernel 5.15 due to kernel function renaming. Fix the tool by detecting symbol existence. See #3687 and #3692. Signed-off-by: Hengqi Chen --- libbpf-tools/cachestat.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/libbpf-tools/cachestat.c b/libbpf-tools/cachestat.c index 05785251328e..95d982089e22 100644 --- a/libbpf-tools/cachestat.c +++ b/libbpf-tools/cachestat.c @@ -142,12 +142,31 @@ int main(int argc, char **argv) libbpf_set_strict_mode(LIBBPF_STRICT_ALL); libbpf_set_print(libbpf_print_fn); - obj = cachestat_bpf__open_and_load(); + obj = cachestat_bpf__open(); if (!obj) { - fprintf(stderr, "failed to open and/or load BPF object\n"); + fprintf(stderr, "failed to open BPF object\n"); return 1; } + /** + * account_page_dirtied was renamed to folio_account_dirtied + * in kernel commit 203a31516616 ("mm/writeback: Add __folio_mark_dirty()") + */ + if (fentry_exists("folio_account_dirtied", NULL)) { + err = bpf_program__set_attach_target(obj->progs.account_page_dirtied, 0, + "folio_account_dirtied"); + if (err) { + fprintf(stderr, "failed to set attach target\n"); + goto cleanup; + } + } + + err = cachestat_bpf__load(obj); + if (err) { + fprintf(stderr, "failed to load BPF object\n"); + goto cleanup; + } + if (!obj->bss) { fprintf(stderr, "Memory-mapping BPF maps is supported starting from Linux 5.7, please upgrade.\n"); goto cleanup;