diff --git a/0001-Add-blk_mq-shared-tags-support-for-dev-d-D.patch b/0001-Add-blk_mq-shared-tags-support-for-dev-d-D.patch new file mode 100644 index 0000000..c9bbf6e --- /dev/null +++ b/0001-Add-blk_mq-shared-tags-support-for-dev-d-D.patch @@ -0,0 +1,219 @@ +From 62486400d35b258e4e3c40c4bf0daedc231f835a Mon Sep 17 00:00:00 2001 +From: Tao Liu +Date: Fri, 27 Jun 2025 23:30:59 +1200 +Subject: [PATCH] Add blk_mq shared tags support for dev -d/-D + +When blk_mq shared tags enabled for devices like scsi, the IO status is +incorrect, e.g: + + crash> dev -d + MAJOR GENDISK NAME REQUEST_QUEUE TOTAL ASYNC SYNC + 8 ffff90528df86000 sda ffff9052a3d61800 144 144 0 + 8 ffff905280718c00 sdb ffff9052a3d63c00 48 48 0 + + crash> epython rqlist + ffff90528e94a5c0 sda is unknown, deadline: 89.992 (90) rq_alloc: 0.196 + ffff90528e92f700 sda is unknown, deadline: 89.998 (90) rq_alloc: 0.202 + ffff90528e95ccc0 sda is unknown, deadline: 89.999 (90) rq_alloc: 0.203 + ffff90528e968bc0 sdb is unknown, deadline: 89.997 (90) rq_alloc: 0.201 + +The root cause is: for shared tags case, only the shared tags are put +into count. Without this patch, tags of all the hw_ctx are counted, +which is incorrect. + +After apply the patch: + + crash> dev -d + MAJOR GENDISK NAME REQUEST_QUEUE TOTAL READ WRITE + 8 ffff90528df86000 sda ffff9052a3d61800 3 3 0 + 8 ffff905280718c00 sdb ffff9052a3d63c00 1 1 0 + +This patch makes the following modification: +1) blk_mq shared tag support. +2) Function renaming: queue_for_each_hw_ctx -> blk_mq_queue_tag_busy_iter, + because the latter is more close to the corresponding kernel function. +3) Extract a new queue_for_each_hw_ctx() function to be called for both + shared-tags case and the hw_ctx case. + +Note: +The patch is safe for earlier kernels which have no blk_mq shared tags +implemented, because the blk_mq_is_shared_tags() check will exit safely. + +Signed-off-by: Tao Liu +--- + defs.h | 3 ++ + dev.c | 96 ++++++++++++++++++++++++++++++++++++++----------------- + symbols.c | 6 ++++ + 3 files changed, 76 insertions(+), 29 deletions(-) + +diff --git a/defs.h b/defs.h +index bbd6d4b..4fecb83 100644 +--- a/defs.h ++++ b/defs.h +@@ -2271,6 +2271,9 @@ struct offset_table { /* stash of commonly-used offsets */ + long task_struct_thread_context_x28; + long neigh_table_hash_heads; + long neighbour_hash; ++ long request_queue_tag_set; ++ long blk_mq_tag_set_flags; ++ long blk_mq_tag_set_shared_tags; + }; + + struct size_table { /* stash of commonly-used sizes */ +diff --git a/dev.c b/dev.c +index 9d38aef..8391d71 100644 +--- a/dev.c ++++ b/dev.c +@@ -4326,6 +4326,12 @@ struct bt_iter_data { + #define MQ_RQ_IN_FLIGHT 1 + #define REQ_OP_BITS 8 + #define REQ_OP_MASK ((1 << REQ_OP_BITS) - 1) ++#define BLK_MQ_F_TAG_HCTX_SHARED (1 << 3) ++ ++static bool blk_mq_is_shared_tags(unsigned int flags) ++{ ++ return flags & BLK_MQ_F_TAG_HCTX_SHARED; ++} + + static uint op_is_write(uint op) + { +@@ -4403,43 +4409,72 @@ static void bt_for_each(ulong q, ulong tags, ulong sbq, uint reserved, uint nr_r + sbitmap_for_each_set(&sc, bt_iter, &iter_data); + } + +-static void queue_for_each_hw_ctx(ulong q, ulong *hctx, uint cnt, struct diskio *dio) ++static bool queue_for_each_hw_ctx(ulong q, ulong blk_mq_tags_ptr, ++ bool bitmap_tags_is_ptr, struct diskio *dio) + { +- uint i; ++ uint nr_reserved_tags = 0; ++ ulong tags = 0, addr = 0; ++ bool ret = FALSE; ++ ++ if (!readmem(blk_mq_tags_ptr, KVADDR, &tags, sizeof(ulong), ++ "blk_mq_hw_ctx.tags", RETURN_ON_ERROR)) ++ goto out; ++ ++ addr = tags + OFFSET(blk_mq_tags_nr_reserved_tags); ++ if (!readmem(addr, KVADDR, &nr_reserved_tags, sizeof(uint), ++ "blk_mq_tags_nr_reserved_tags", RETURN_ON_ERROR)) ++ goto out; ++ ++ if (nr_reserved_tags) { ++ addr = tags + OFFSET(blk_mq_tags_breserved_tags); ++ if (bitmap_tags_is_ptr && ++ !readmem(addr, KVADDR, &addr, sizeof(ulong), ++ "blk_mq_tags.bitmap_tags", RETURN_ON_ERROR)) ++ goto out; ++ bt_for_each(q, tags, addr, 1, nr_reserved_tags, dio); ++ } ++ addr = tags + OFFSET(blk_mq_tags_bitmap_tags); ++ if (bitmap_tags_is_ptr && ++ !readmem(addr, KVADDR, &addr, sizeof(ulong), ++ "blk_mq_tags.bitmap_tags", RETURN_ON_ERROR)) ++ goto out; ++ bt_for_each(q, tags, addr, 0, nr_reserved_tags, dio); ++ ++ ret = TRUE; ++out: ++ return ret; ++} ++ ++/* ++ * Replica of kernel block/blk-mq-tag.c:blk_mq_queue_tag_busy_iter() ++*/ ++static void blk_mq_queue_tag_busy_iter(ulong q, ulong *hctx, uint cnt, ++ struct diskio *dio) ++{ ++ uint i, flags; + int bitmap_tags_is_ptr = 0; ++ ulong addr = 0; + + if (MEMBER_TYPE("blk_mq_tags", "bitmap_tags") == TYPE_CODE_PTR) + bitmap_tags_is_ptr = 1; + +- for (i = 0; i < cnt; i++) { +- ulong addr = 0, tags = 0; +- uint nr_reserved_tags = 0; ++ readmem(q + OFFSET(request_queue_tag_set), KVADDR, &addr, ++ sizeof(ulong), "request_queue.tag_set", RETURN_ON_ERROR); + +- /* Tags owned by the block driver */ +- addr = hctx[i] + OFFSET(blk_mq_hw_ctx_tags); +- if (!readmem(addr, KVADDR, &tags, sizeof(ulong), +- "blk_mq_hw_ctx.tags", RETURN_ON_ERROR)) +- break; ++ readmem(addr + OFFSET(blk_mq_tag_set_flags), KVADDR, ++ &flags, sizeof(uint), "blk_mq_tag_set.flags", RETURN_ON_ERROR); + +- addr = tags + OFFSET(blk_mq_tags_nr_reserved_tags); +- if (!readmem(addr, KVADDR, &nr_reserved_tags, sizeof(uint), +- "blk_mq_tags_nr_reserved_tags", RETURN_ON_ERROR)) +- break; ++ if (blk_mq_is_shared_tags(flags)) { ++ addr = addr + OFFSET(blk_mq_tag_set_shared_tags); ++ queue_for_each_hw_ctx(q, addr, bitmap_tags_is_ptr, dio); ++ return; ++ } + +- if (nr_reserved_tags) { +- addr = tags + OFFSET(blk_mq_tags_breserved_tags); +- if (bitmap_tags_is_ptr && +- !readmem(addr, KVADDR, &addr, sizeof(ulong), +- "blk_mq_tags.bitmap_tags", RETURN_ON_ERROR)) +- break; +- bt_for_each(q, tags, addr, 1, nr_reserved_tags, dio); +- } +- addr = tags + OFFSET(blk_mq_tags_bitmap_tags); +- if (bitmap_tags_is_ptr && +- !readmem(addr, KVADDR, &addr, sizeof(ulong), +- "blk_mq_tags.bitmap_tags", RETURN_ON_ERROR)) +- break; +- bt_for_each(q, tags, addr, 0, nr_reserved_tags, dio); ++ for (i = 0; i < cnt; i++) { ++ /* Tags owned by the block driver */ ++ addr = hctx[i] + OFFSET(blk_mq_hw_ctx_tags); ++ if (queue_for_each_hw_ctx(q, addr, bitmap_tags_is_ptr, dio) == FALSE) ++ return; + } + } + +@@ -4489,7 +4524,7 @@ static void get_mq_diskio_from_hw_queues(ulong q, struct diskio *dio) + return; + } + +- queue_for_each_hw_ctx(q, hctx_array, cnt, dio); ++ blk_mq_queue_tag_busy_iter(q, hctx_array, cnt, dio); + + FREEBUF(hctx_array); + } +@@ -4914,6 +4949,9 @@ void diskio_init(void) + MEMBER_SIZE_INIT(class_private_devices, "class_private", + "class_devices"); + MEMBER_OFFSET_INIT(disk_stats_in_flight, "disk_stats", "in_flight"); ++ MEMBER_OFFSET_INIT(request_queue_tag_set, "request_queue", "tag_set"); ++ MEMBER_OFFSET_INIT(blk_mq_tag_set_flags, "blk_mq_tag_set", "flags"); ++ MEMBER_OFFSET_INIT(blk_mq_tag_set_shared_tags, "blk_mq_tag_set", "shared_tags"); + + dt->flags |= DISKIO_INIT; + } +diff --git a/symbols.c b/symbols.c +index e30fafe..794519a 100644 +--- a/symbols.c ++++ b/symbols.c +@@ -11487,6 +11487,12 @@ dump_offset_table(char *spec, ulong makestruct) + OFFSET(blk_mq_tags_nr_reserved_tags)); + fprintf(fp, " blk_mq_tags_rqs: %ld\n", + OFFSET(blk_mq_tags_rqs)); ++ fprintf(fp, " request_queue_tag_set: %ld\n", ++ OFFSET(request_queue_tag_set)); ++ fprintf(fp, " blk_mq_tag_set_flags: %ld\n", ++ OFFSET(blk_mq_tag_set_flags)); ++ fprintf(fp, " blk_mq_tag_set_shared_tags: %ld\n", ++ OFFSET(blk_mq_tag_set_shared_tags)); + + fprintf(fp, " subsys_private_subsys: %ld\n", OFFSET(subsys_private_subsys)); + fprintf(fp, " subsys_private_klist_devices: %ld\n", +-- +2.47.0 + diff --git a/crash.spec b/crash.spec index af24d0b..22dec60 100644 --- a/crash.spec +++ b/crash.spec @@ -4,7 +4,7 @@ Summary: Kernel analysis utility for live systems, netdump, diskdump, kdump, LKCD or mcore dumpfiles Name: crash Version: 9.0.0 -Release: 3%{?dist}.alma.1 +Release: 4%{?dist}.alma.1 License: GPL-3.0-only Source0: https://github.com/crash-utility/crash/archive/crash-%{version}.tar.gz Source1: http://ftp.gnu.org/gnu/gdb/gdb-16.2.tar.gz @@ -33,6 +33,7 @@ Patch12: 0002-doc-Update-requirements-for-building-on-Fedora.patch Patch13: 0003-gdb-Fix-a-regression-for-eppic-extension-on-gdb-16.2.patch Patch14: 0004-Fix-crash-initialization-failure-on-LoongArch-with-r.patch Patch15: 0005-gdb-Disable-DT_DEBUG-lookup-by-GDB-inside-the-vmcore.patch +Patch16: 0001-Add-blk_mq-shared-tags-support-for-dev-d-D.patch %description The core analysis suite is a self-contained tool that can be used to @@ -68,6 +69,7 @@ offered by Mission Critical Linux, or the LKCD kernel patch. %patch -P 13 -p1 %patch -P 14 -p1 %patch -P 15 -p1 +%patch -P 16 -p1 %build @@ -93,9 +95,12 @@ cp -p defs.h %{buildroot}%{_includedir}/crash %{_includedir}/* %changelog -* Tue Jul 29 2025 Eduard Abdullin - 9.0.0-3.alma.1 +* Thu Aug 07 2025 Eduard Abdullin - 9.0.0-4.alma.1 - Debrand for AlmaLinux +* Wed Aug 6 2025 Tao Liu - 9.0.0-4 +- Rebase to upstream crash 62486400d35 + * Fri Jul 25 2025 Tao Liu - 9.0.0-3 - Rebase to upstream crash 2c69f93e59c