Hi, Kazu
On Fri, Jun 10, 2022 at 2:22 PM HAGIO KAZUHITO(萩尾 一仁) <[email protected]>
wrote:

> There have been a few reports that the "dev -d|-D" options displayed
> incorrect I/O stats due to racy blk_mq_ctx.rq_* counters.  To fix it,
> make the options parse sbitmap to count I/O stats on Linux 4.18 and
> later kernels, which include RHEL8 ones.
>
> To do this, adjust to the blk_mq_tags structure of Linux 5.10 through
> 5.15 kernels, which contain kernel commit 222a5ae03cdd ("blk-mq: Use
> pointers for blk_mq_tags bitmap tags") and do not contain ae0f1a732f4a
> ("blk-mq: Stop using pointers for blk_mq_tags bitmap tags").
>

Nice.

Signed-off-by: Kazuhito Hagio <[email protected]>
> ---
>   dev.c | 25 +++++++++++++++++++++++--
>   1 file changed, 23 insertions(+), 2 deletions(-)
>
> diff --git a/dev.c b/dev.c
> index 0172c83ffaea..1685f9302837 100644
> --- a/dev.c
> +++ b/dev.c
> @@ -4339,6 +4339,10 @@ static void bt_for_each(ulong q, ulong tags, ulong
> sbq, uint reserved, uint nr_r
>   static void queue_for_each_hw_ctx(ulong q, ulong *hctx, uint cnt, struct
> diskio *dio)
>   {
>         uint i;
> +       int bitmap_tags_is_ptr = 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;
> @@ -4357,9 +4361,17 @@ static void queue_for_each_hw_ctx(ulong q, ulong
> *hctx, uint cnt, struct diskio
>
>                 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);
>         }
>   }
> @@ -4423,14 +4435,23 @@ get_mq_diskio(unsigned long q, unsigned long
> *mq_count)
>         unsigned long mctx_addr;
>         struct diskio tmp = {0};
>
> -       if (INVALID_MEMBER(blk_mq_ctx_rq_dispatched) ||
> -           INVALID_MEMBER(blk_mq_ctx_rq_completed)) {
> +       /*
> +        * Currently this function does not support old blk-mq
> implementation
> +        * before 12f5b9314545 ("blk-mq: Remove generation seqeunce"), so
> +        * filter them out.
> +        */
> +       if (VALID_MEMBER(request_state)) {
> +               if (CRASHDEBUG(1))
> +                       fprintf(fp, "mq: using sbitmap\n");
>                 get_mq_diskio_from_hw_queues(q, &tmp);
>                 mq_count[0] = tmp.read;
>                 mq_count[1] = tmp.write;
>                 return;
>         }
>
> +       if (CRASHDEBUG(1))
> +               fprintf(fp, "mq: using blk_mq_ctx counters\n");
>

Is the following information clearer?
fprintf(fp, "mq: using the blk_mq_ctx <rq_completed|rq_dispatched>
counters\n");

Other changes look good, for this fix:
Acked-by: Lianbo Jiang <[email protected]>n

Thanks.

+
>         readmem(q + OFFSET(request_queue_queue_ctx), KVADDR, &queue_ctx,
>                 sizeof(ulong), "request_queue.queue_ctx",
>                 FAULT_ON_ERROR);
> --
> 2.31.1
>
--
Crash-utility mailing list
[email protected]
https://listman.redhat.com/mailman/listinfo/crash-utility
Contribution Guidelines: https://github.com/crash-utility/crash/wiki

Reply via email to