Hey Greg, Turns out the fixes I marked for stable@ aren't actually fixing anything (after applying the changes: code is cleaner but no meaningful difference in IO stats). That is because DM was already patching up the 'sectors' portion of the stats after a split. The other fields I documented in the following header aren't tied to payload (see __part_start_io_acct). So no _real_ need to backport to 5.4 or 5.10. Sorry for the noise. Mike On Sat, Jan 29 2022 at 8:31P -0500, gregkh@xxxxxxxxxxxxxxxxxxx <gregkh@xxxxxxxxxxxxxxxxxxx> wrote: > > The patch below does not apply to the 5.4-stable tree. > If someone wants it applied there, or to any other stable or longterm > tree, then please email the backport, including the original git commit > id to <stable@xxxxxxxxxxxxxxx>. > > thanks, > > greg k-h > > ------------------ original commit in Linus's tree ------------------ > > From f524d9c95fab54783d0038f7a3e8c014d5b56857 Mon Sep 17 00:00:00 2001 > From: Mike Snitzer <snitzer@xxxxxxxxxx> > Date: Fri, 28 Jan 2022 10:58:40 -0500 > Subject: [PATCH] dm: revert partial fix for redundant bio-based IO accounting > > Reverts a1e1cb72d9649 ("dm: fix redundant IO accounting for bios that > need splitting") because it was too narrow in scope (only addressed > redundant 'sectors[]' accounting and not ios, nsecs[], etc). > > Cc: stable@xxxxxxxxxxxxxxx > Signed-off-by: Mike Snitzer <snitzer@xxxxxxxxxx> > Link: https://lore.kernel.org/r/20220128155841.39644-3-snitzer@xxxxxxxxxx > Signed-off-by: Jens Axboe <axboe@xxxxxxxxx> > > diff --git a/drivers/md/dm.c b/drivers/md/dm.c > index c0ae8087c602..9849114b3c08 100644 > --- a/drivers/md/dm.c > +++ b/drivers/md/dm.c > @@ -1442,9 +1442,6 @@ static void init_clone_info(struct clone_info *ci, struct mapped_device *md, > ci->sector = bio->bi_iter.bi_sector; > } > > -#define __dm_part_stat_sub(part, field, subnd) \ > - (part_stat_get(part, field) -= (subnd)) > - > /* > * Entry point to split a bio into clones and submit them to the targets. > */ > @@ -1480,18 +1477,6 @@ static void __split_and_process_bio(struct mapped_device *md, > GFP_NOIO, &md->queue->bio_split); > ci.io->orig_bio = b; > > - /* > - * Adjust IO stats for each split, otherwise upon queue > - * reentry there will be redundant IO accounting. > - * NOTE: this is a stop-gap fix, a proper fix involves > - * significant refactoring of DM core's bio splitting > - * (by eliminating DM's splitting and just using bio_split) > - */ > - part_stat_lock(); > - __dm_part_stat_sub(dm_disk(md)->part0, > - sectors[op_stat_group(bio_op(bio))], ci.sector_count); > - part_stat_unlock(); > - > bio_chain(b, bio); > trace_block_split(b, bio->bi_iter.bi_sector); > submit_bio_noacct(bio); >