applied: 
https://github.com/crash-utility/crash/commit/62486400d35b258e4e3c40c4bf0daedc231f835a

On Wed, Aug 6, 2025 at 2:59 PM Tao Liu <l...@redhat.com> wrote:
>
> On Wed, Aug 6, 2025 at 2:40 PM Lianbo Jiang <liji...@redhat.com> wrote:
> >
> > Hi, Tao
> >
> > Thank you for the patch.
> >
> > On 6/27/25 19:33, devel-requ...@lists.crash-utility.osci.io wrote:
> > > Date: Fri, 27 Jun 2025 23:30:59 +1200
> > > From: Tao Liu<l...@redhat.com>
> > > Subject: [Crash-utility] [PATCH] Add blk_mq shared tags support for
> > >       dev -d/-D
> > > To:devel@lists.crash-utility.osci.io
> > > Cc: Tao Liu<l...@redhat.com>
> > > Message-ID:<20250627113058.42612-2-l...@redhat.com>
> > > Content-Type: text/plain; charset="US-ASCII"; x-default=true
> > >
> > > 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<l...@redhat.com>
> > > ---
> > >
> > > Please discard the previous patch "Filter repeated rq for cmd dev -d/-D",
> > > because filtering is an incorrect fix.
> > >
> > > ---
> > >   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..0a4d5c9 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 i, nr_reserved_tags = 0;
> >
> > Found a warning here:
> >
> > gcc -c -g -DX86_64 -DLZO -DGDB_16_2  dev.c -Wall -O2 -Wstrict-prototypes
> > -Wmissing-prototypes -fstack-protector -Wformat-security
> > dev.c: In function ‘queue_for_each_hw_ctx’:
> > dev.c:4415:14: warning: unused variable ‘i’ [-Wunused-variable]
> >   4415 |         uint i, nr_reserved_tags = 0;
> >        |              ^
> >
> >
> > Other changes are fine to me, so: Ack(with the above fix).
> >
> Thanks for the comments, will apply it with the corrections.
>
> Thanks,
> Tao Liu
>
> >
> > Thanks
> >
> > Lianbo
> >
> > > +     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
> >
--
Crash-utility mailing list -- devel@lists.crash-utility.osci.io
To unsubscribe send an email to devel-le...@lists.crash-utility.osci.io
https://${domain_name}/admin/lists/devel.lists.crash-utility.osci.io/
Contribution Guidelines: https://github.com/crash-utility/crash/wiki

Reply via email to