On Thu, Jan 27 2022 at 5:56P -0500, Mike Snitzer <snitzer@xxxxxxxxxx> wrote: > Record the start_time for a bio but defer the starting block core's IO > accounting until after IO is submitted using bio_start_io_acct_time(). > > This approach avoids the need to mess around with any of the > individual IO stats in response to a bio_split() that follows bio > submission. > > Reported-by: Bud Brown <bubrown@xxxxxxxxxx> > Cc: stable@xxxxxxxxxxxxxxx > Depends-on: f9893e1da2e3 ("block: add bio_start_io_acct_time() to control start_time") > Signed-off-by: Mike Snitzer <snitzer@xxxxxxxxxx> > --- > drivers/md/dm.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/drivers/md/dm.c b/drivers/md/dm.c > index 9849114b3c08..144436301a57 100644 > --- a/drivers/md/dm.c > +++ b/drivers/md/dm.c > @@ -489,7 +489,7 @@ static void start_io_acct(struct dm_io *io) > struct mapped_device *md = io->md; > struct bio *bio = io->orig_bio; > > - io->start_time = bio_start_io_acct(bio); > + __bio_start_io_acct(bio, io->start_time); > if (unlikely(dm_stats_used(&md->stats))) > dm_stats_account_io(&md->stats, bio_data_dir(bio), > bio->bi_iter.bi_sector, bio_sectors(bio), This should be calling bio_start_io_acct_time(). I updated the header but somehow dropped the code change before sending. Mike > @@ -535,7 +535,7 @@ static struct dm_io *alloc_io(struct mapped_device *md, struct bio *bio) > io->md = md; > spin_lock_init(&io->endio_lock); > > - start_io_acct(io); > + io->start_time = READ_ONCE(jiffies); > > return io; > } > @@ -1482,6 +1482,7 @@ static void __split_and_process_bio(struct mapped_device *md, > submit_bio_noacct(bio); > } > } > + start_io_acct(ci.io); > > /* drop the extra reference count */ > dm_io_dec_pending(ci.io, errno_to_blk_status(error)); > -- > 2.15.0 >