On Mon, Jun 19, 2023 at 8:50 PM Yu Kuai <yukuai1@xxxxxxxxxxxxxxx> wrote: > > From: Yu Kuai <yukuai3@xxxxxxxxxx> > > Make sure that 'active_io' will represent inflight io instead of io that > is dispatching, and io accounting from all levels will be consistent. > > Signed-off-by: Yu Kuai <yukuai3@xxxxxxxxxx> > --- > drivers/md/raid10.c | 20 +++++++++----------- > drivers/md/raid10.h | 1 - > 2 files changed, 9 insertions(+), 12 deletions(-) > > diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c > index 79067769e44b..69f6d7b1e600 100644 > --- a/drivers/md/raid10.c > +++ b/drivers/md/raid10.c > @@ -325,8 +325,6 @@ 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 (r10_bio->start_time) > - bio_end_io_acct(bio, r10_bio->start_time); > bio_endio(bio); > /* > * Wake up any possible resync thread that waits for the device > @@ -1172,7 +1170,7 @@ static bool regular_request_wait(struct mddev *mddev, struct r10conf *conf, > } > > static void raid10_read_request(struct mddev *mddev, struct bio *bio, > - struct r10bio *r10_bio) > + struct r10bio *r10_bio, bool io_accounting) > { > struct r10conf *conf = mddev->private; > struct bio *read_bio; > @@ -1243,9 +1241,10 @@ static void raid10_read_request(struct mddev *mddev, struct bio *bio, > } > slot = r10_bio->read_slot; > > - if (!r10_bio->start_time && > - blk_queue_io_stat(bio->bi_bdev->bd_disk->queue)) > - r10_bio->start_time = bio_start_io_acct(bio); > + if (io_accounting) { > + md_account_bio(mddev, &bio); > + r10_bio->master_bio = bio; > + } > read_bio = bio_alloc_clone(rdev->bdev, bio, gfp, &mddev->bio_set); > > r10_bio->devs[slot].bio = read_bio; > @@ -1543,8 +1542,8 @@ static void raid10_write_request(struct mddev *mddev, struct bio *bio, > r10_bio->master_bio = bio; > } > > - if (blk_queue_io_stat(bio->bi_bdev->bd_disk->queue)) > - r10_bio->start_time = bio_start_io_acct(bio); > + md_account_bio(mddev, &bio); > + r10_bio->master_bio = bio; > atomic_set(&r10_bio->remaining, 1); > md_bitmap_startwrite(mddev->bitmap, r10_bio->sector, r10_bio->sectors, 0); > > @@ -1571,12 +1570,11 @@ static void __make_request(struct mddev *mddev, struct bio *bio, int sectors) > r10_bio->sector = bio->bi_iter.bi_sector; > r10_bio->state = 0; > r10_bio->read_slot = -1; > - r10_bio->start_time = 0; > memset(r10_bio->devs, 0, sizeof(r10_bio->devs[0]) * > conf->geo.raid_disks); > > if (bio_data_dir(bio) == READ) > - raid10_read_request(mddev, bio, r10_bio); > + raid10_read_request(mddev, bio, r10_bio, true); > else > raid10_write_request(mddev, bio, r10_bio); > } > @@ -2985,7 +2983,7 @@ static void handle_read_error(struct mddev *mddev, struct r10bio *r10_bio) > > rdev_dec_pending(rdev, mddev); > r10_bio->state = 0; > - raid10_read_request(mddev, r10_bio->master_bio, r10_bio); > + raid10_read_request(mddev, r10_bio->master_bio, r10_bio, false); > /* > * allow_barrier after re-submit to ensure no sync io > * can be issued while regular io pending. > diff --git a/drivers/md/raid10.h b/drivers/md/raid10.h > index 63e48b11b552..2e75e88d0802 100644 > --- a/drivers/md/raid10.h > +++ b/drivers/md/raid10.h > @@ -123,7 +123,6 @@ struct r10bio { > sector_t sector; /* virtual sector number */ > int sectors; > unsigned long state; > - unsigned long start_time; > struct mddev *mddev; > /* > * original bio going to /dev/mdx > -- > 2.39.2 > Reviewed-by: Xiao Ni <xni@xxxxxxxxxx>