159 lines
4.9 KiB
Diff
159 lines
4.9 KiB
Diff
|
From 50480835adf15a389267393674504551b68987a2 Mon Sep 17 00:00:00 2001
|
||
|
From: xingfeng2510 <xingfeng25100@163.com>
|
||
|
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 <jmarchan@redhat.com>
|
||
|
---
|
||
|
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
|
||
|
|