Message ID | 20220127225648.28729-4-snitzer@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | block/dm: fix bio-based DM IO accounting | expand |
On Thu, Jan 27 2022 at 5:56P -0500, Mike Snitzer <snitzer@redhat.com> 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@redhat.com> > Cc: stable@vger.kernel.org > Depends-on: f9893e1da2e3 ("block: add bio_start_io_acct_time() to control start_time") > Signed-off-by: Mike Snitzer <snitzer@redhat.com> > --- > 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 >
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), @@ -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));
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@redhat.com> Cc: stable@vger.kernel.org Depends-on: f9893e1da2e3 ("block: add bio_start_io_acct_time() to control start_time") Signed-off-by: Mike Snitzer <snitzer@redhat.com> --- drivers/md/dm.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)