Kernel commit <9a14d6ce4135> ("block: remove debugfs blk_mq_ctx
dispatched/merged/completed attributes") removed the member
rq_dispatched and rq_completed from struct blk_mq_ctx. Without
this patch, crash will fail with the following error:

crash> dev -d
MAJOR GENDISK            NAME       REQUEST_QUEUE      TOTAL ASYNC  SYNC

dev: invalid structure member offset: blk_mq_ctx_rq_dispatched
     FILE: dev.c  LINE: 4229  FUNCTION: get_one_mctx_diskio()

Signed-off-by: Lianbo Jiang <[email protected]>
---
change since v1:
[1] display prompt information "(not supported)" instead of the
statistical result if kernel does not support it

 dev.c | 56 ++++++++++++++++++++++++++++++++++++++------------------
 1 file changed, 38 insertions(+), 18 deletions(-)

diff --git a/dev.c b/dev.c
index effe789f38d8..c5e38e1c5376 100644
--- a/dev.c
+++ b/dev.c
@@ -4246,6 +4246,10 @@ get_mq_diskio(unsigned long q, unsigned long *mq_count)
        unsigned long mctx_addr;
        struct diskio tmp;
 
+       if (!MEMBER_EXISTS("blk_mq_ctx", "rq_dispatched") &&
+               !MEMBER_EXISTS("blk_mq_ctx", "rq_completed"))
+               return;
+
        memset(&tmp, 0x00, sizeof(struct diskio));
 
        readmem(q + OFFSET(request_queue_queue_ctx), KVADDR, &queue_ctx,
@@ -4475,24 +4479,40 @@ display_one_diskio(struct iter *i, unsigned long 
gendisk, ulong flags)
                && (io.read + io.write == 0))
                return;
 
-       fprintf(fp, "%s%s%s  %s%s%s%s  %s%5d%s%s%s%s%s",
-               mkstring(buf0, 5, RJUST|INT_DEC, (char *)(unsigned long)major),
-               space(MINSPACE),
-               mkstring(buf1, VADDR_PRLEN, LJUST|LONG_HEX, (char *)gendisk),
-               space(MINSPACE),
-               mkstring(buf2, 10, LJUST, disk_name),
-               space(MINSPACE),
-               mkstring(buf3, VADDR_PRLEN <= 11 ? 11 : VADDR_PRLEN,
-                        LJUST|LONG_HEX, (char *)queue_addr),
-               space(MINSPACE),
-               io.read + io.write,
-               space(MINSPACE),
-               mkstring(buf4, 5, RJUST|INT_DEC,
-                       (char *)(unsigned long)io.read),
-               space(MINSPACE),
-               mkstring(buf5, 5, RJUST|INT_DEC,
-                       (char *)(unsigned long)io.write),
-               space(MINSPACE));
+       if (!MEMBER_EXISTS("blk_mq_ctx", "rq_dispatched") &&
+               !MEMBER_EXISTS("blk_mq_ctx", "rq_completed"))
+               fprintf(fp, "%s%s%s  %s%s%s%s  %s%s%s",
+                       mkstring(buf0, 5, RJUST|INT_DEC, (char *)(unsigned 
long)major),
+                       space(MINSPACE),
+                       mkstring(buf1, VADDR_PRLEN, LJUST|LONG_HEX, (char 
*)gendisk),
+                       space(MINSPACE),
+                       mkstring(buf2, 10, LJUST, disk_name),
+                       space(MINSPACE),
+                       mkstring(buf3, VADDR_PRLEN <= 11 ? 11 : VADDR_PRLEN,
+                                LJUST|LONG_HEX, (char *)queue_addr),
+                       space(MINSPACE),
+                       mkstring(buf4, 16, LJUST, "(not supported)"),
+                       space(MINSPACE));
+
+       else
+               fprintf(fp, "%s%s%s  %s%s%s%s  %s%5d%s%s%s%s%s",
+                       mkstring(buf0, 5, RJUST|INT_DEC, (char *)(unsigned 
long)major),
+                       space(MINSPACE),
+                       mkstring(buf1, VADDR_PRLEN, LJUST|LONG_HEX, (char 
*)gendisk),
+                       space(MINSPACE),
+                       mkstring(buf2, 10, LJUST, disk_name),
+                       space(MINSPACE),
+                       mkstring(buf3, VADDR_PRLEN <= 11 ? 11 : VADDR_PRLEN,
+                                LJUST|LONG_HEX, (char *)queue_addr),
+                       space(MINSPACE),
+                       io.read + io.write,
+                       space(MINSPACE),
+                       mkstring(buf4, 5, RJUST|INT_DEC,
+                               (char *)(unsigned long)io.read),
+                       space(MINSPACE),
+                       mkstring(buf5, 5, RJUST|INT_DEC,
+                               (char *)(unsigned long)io.write),
+                       space(MINSPACE));
 
        if (VALID_MEMBER(request_queue_in_flight)) {
                if (!use_mq_interface(queue_addr)) {
-- 
2.20.1

--
Crash-utility mailing list
[email protected]
https://listman.redhat.com/mailman/listinfo/crash-utility

Reply via email to