On Fri, Jun 9, 2023 at 2:47 AM <linan666@xxxxxxxxxxxxxxx> wrote: > > From: Li Nan <linan122@xxxxxxxxxx> > > /sys/block/[device]/queue/iostats is used to control whether to count io > stat. Write 0 to it will clear queue_flags QUEUE_FLAG_IO_STAT which means > iostats is disabled. If we disable iostats and later endable it, the io > issued during this period will be counted incorrectly, inflight will be > decreased to -1. > > //T1 set iostats > echo 0 > /sys/block/md0/queue/iostats > clear QUEUE_FLAG_IO_STAT > > //T2 issue io > if (QUEUE_FLAG_IO_STAT) -> false > bio_start_io_acct > inflight++ > > echo 1 > /sys/block/md0/queue/iostats > set QUEUE_FLAG_IO_STAT > > //T3 io end > if (QUEUE_FLAG_IO_STAT) -> true > bio_end_io_acct > inflight-- -> -1 > > Also, if iostats is enabled while issuing io but disabled while io end, > inflight will never be decreased. > > Fix it by checking start_time when io end. Only check QUEUE_FLAG_IO_STAT > while issuing io, just like request based devices. > > Fixes: 528bc2cf2fcc ("md/raid10: enable io accounting") > Signed-off-by: Li Nan <linan122@xxxxxxxxxx> The subject and commit log is a little confusing. I updated it a little bit and applied to md-next. Thanks, Song > --- > drivers/md/raid10.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c > index 381c21f7fb06..bf9dca5c25c3 100644 > --- a/drivers/md/raid10.c > +++ b/drivers/md/raid10.c > @@ -325,7 +325,7 @@ static void raid_end_bio_io(struct r10bio *r10_bio) > if (!test_bit(R10BIO_Uptodate, &r10_bio->state)) > bio->bi_status = BLK_STS_IOERR; > > - if (blk_queue_io_stat(bio->bi_bdev->bd_disk->queue)) > + if (r10_bio->start_time) > bio_end_io_acct(bio, r10_bio->start_time); > bio_endio(bio); > /* > -- > 2.39.2 >