From 50480835adf15a389267393674504551b68987a2 Mon Sep 17 00:00:00 2001 From: xingfeng2510 Date: Wed, 30 Mar 2022 16:10:51 +0800 Subject: [PATCH 2/2] libbpf-tools: Fix dropped request->rq_disk for kernel 5.17+ Signed-off-by: Jerome Marchand --- libbpf-tools/biolatency.bpf.c | 20 ++++++++++++++++++-- libbpf-tools/biosnoop.bpf.c | 12 +++++++++++- libbpf-tools/biostacks.bpf.c | 12 +++++++++++- libbpf-tools/bitesize.bpf.c | 12 +++++++++++- 4 files changed, 51 insertions(+), 5 deletions(-) diff --git a/libbpf-tools/biolatency.bpf.c b/libbpf-tools/biolatency.bpf.c index 648dda78..8f325046 100644 --- a/libbpf-tools/biolatency.bpf.c +++ b/libbpf-tools/biolatency.bpf.c @@ -19,6 +19,10 @@ const volatile bool targ_ms = false; const volatile bool filter_dev = false; const volatile __u32 targ_dev = 0; +struct request_queue___x { + struct gendisk *disk; +} __attribute__((preserve_access_index)); + struct { __uint(type, BPF_MAP_TYPE_CGROUP_ARRAY); __type(key, u32); @@ -53,9 +57,15 @@ int trace_rq_start(struct request *rq, int issue) u64 ts = bpf_ktime_get_ns(); if (filter_dev) { - struct gendisk *disk = BPF_CORE_READ(rq, rq_disk); + struct request_queue___x *q = (void *)BPF_CORE_READ(rq, q); + struct gendisk *disk; u32 dev; + if (bpf_core_field_exists(q->disk)) + disk = BPF_CORE_READ(q, disk); + else + disk = BPF_CORE_READ(rq, rq_disk); + dev = disk ? MKDEV(BPF_CORE_READ(disk, major), BPF_CORE_READ(disk, first_minor)) : 0; if (targ_dev != dev) @@ -119,7 +129,13 @@ int BPF_PROG(block_rq_complete, struct request *rq, int error, goto cleanup; if (targ_per_disk) { - struct gendisk *disk = BPF_CORE_READ(rq, rq_disk); + struct request_queue___x *q = (void *)BPF_CORE_READ(rq, q); + struct gendisk *disk; + + if (bpf_core_field_exists(q->disk)) + disk = BPF_CORE_READ(q, disk); + else + disk = BPF_CORE_READ(rq, rq_disk); hkey.dev = disk ? MKDEV(BPF_CORE_READ(disk, major), BPF_CORE_READ(disk, first_minor)) : 0; diff --git a/libbpf-tools/biosnoop.bpf.c b/libbpf-tools/biosnoop.bpf.c index 54226e43..05903473 100644 --- a/libbpf-tools/biosnoop.bpf.c +++ b/libbpf-tools/biosnoop.bpf.c @@ -15,6 +15,10 @@ const volatile __u32 targ_dev = 0; extern __u32 LINUX_KERNEL_VERSION __kconfig; +struct request_queue___x { + struct gendisk *disk; +} __attribute__((preserve_access_index)); + struct { __uint(type, BPF_MAP_TYPE_CGROUP_ARRAY); __type(key, u32); @@ -92,7 +96,13 @@ int trace_rq_start(struct request *rq, bool insert) stagep = bpf_map_lookup_elem(&start, &rq); if (!stagep) { - struct gendisk *disk = BPF_CORE_READ(rq, rq_disk); + struct request_queue___x *q = (void *)BPF_CORE_READ(rq, q); + struct gendisk *disk; + + if (bpf_core_field_exists(q->disk)) + disk = BPF_CORE_READ(q, disk); + else + disk = BPF_CORE_READ(rq, rq_disk); stage.dev = disk ? MKDEV(BPF_CORE_READ(disk, major), BPF_CORE_READ(disk, first_minor)) : 0; diff --git a/libbpf-tools/biostacks.bpf.c b/libbpf-tools/biostacks.bpf.c index 01993737..c13975fa 100644 --- a/libbpf-tools/biostacks.bpf.c +++ b/libbpf-tools/biostacks.bpf.c @@ -14,6 +14,10 @@ const volatile bool targ_ms = false; const volatile bool filter_dev = false; const volatile __u32 targ_dev = -1; +struct request_queue___x { + struct gendisk *disk; +} __attribute__((preserve_access_index)); + struct internal_rqinfo { u64 start_ts; struct rqinfo rqinfo; @@ -41,9 +45,15 @@ static __always_inline int trace_start(void *ctx, struct request *rq, bool merge_bio) { struct internal_rqinfo *i_rqinfop = NULL, i_rqinfo = {}; - struct gendisk *disk = BPF_CORE_READ(rq, rq_disk); + struct request_queue___x *q = (void *)BPF_CORE_READ(rq, q); + struct gendisk *disk; u32 dev; + if (bpf_core_field_exists(q->disk)) + disk = BPF_CORE_READ(q, disk); + else + disk = BPF_CORE_READ(rq, rq_disk); + dev = disk ? MKDEV(BPF_CORE_READ(disk, major), BPF_CORE_READ(disk, first_minor)) : 0; if (filter_dev && targ_dev != dev) diff --git a/libbpf-tools/bitesize.bpf.c b/libbpf-tools/bitesize.bpf.c index 80672c9b..5066ca33 100644 --- a/libbpf-tools/bitesize.bpf.c +++ b/libbpf-tools/bitesize.bpf.c @@ -13,6 +13,10 @@ const volatile __u32 targ_dev = 0; extern __u32 LINUX_KERNEL_VERSION __kconfig; +struct request_queue___x { + struct gendisk *disk; +} __attribute__((preserve_access_index)); + struct { __uint(type, BPF_MAP_TYPE_HASH); __uint(max_entries, 10240); @@ -41,9 +45,15 @@ static int trace_rq_issue(struct request *rq) u64 slot; if (filter_dev) { - struct gendisk *disk = BPF_CORE_READ(rq, rq_disk); + struct request_queue___x *q = (void *)BPF_CORE_READ(rq, q); + struct gendisk *disk; u32 dev; + if (bpf_core_field_exists(q->disk)) + disk = BPF_CORE_READ(q, disk); + else + disk = BPF_CORE_READ(rq, rq_disk); + dev = disk ? MKDEV(BPF_CORE_READ(disk, major), BPF_CORE_READ(disk, first_minor)) : 0; if (targ_dev != dev) -- 2.35.1