Blame SOURCES/bcc-0.24.0-libbpf-tools-Fix-dropped-request-rq_disk-for-kernel-.patch

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