dm: avoid needless dm_io access if all IO accounting is disabled
authorMike Snitzer <snitzer@kernel.org>
Tue, 13 Jun 2023 19:19:42 +0000 (15:19 -0400)
committerMike Snitzer <snitzer@kernel.org>
Fri, 16 Jun 2023 22:24:13 +0000 (18:24 -0400)
Update dm_io_acct() to eliminate most dm_io struct accesses if both
block core's IO stats and dm-stats are disabled.

Signed-off-by: Mike Snitzer <snitzer@kernel.org>
drivers/md/dm.c

index c8b3d68..658323a 100644 (file)
@@ -487,51 +487,50 @@ u64 dm_start_time_ns_from_clone(struct bio *bio)
 }
 EXPORT_SYMBOL_GPL(dm_start_time_ns_from_clone);
 
-static bool bio_is_flush_with_data(struct bio *bio)
+static inline bool bio_is_flush_with_data(struct bio *bio)
 {
        return ((bio->bi_opf & REQ_PREFLUSH) && bio->bi_iter.bi_size);
 }
 
-static void dm_io_acct(struct dm_io *io, bool end)
+static inline unsigned int dm_io_sectors(struct dm_io *io, struct bio *bio)
 {
-       struct dm_stats_aux *stats_aux = &io->stats_aux;
-       unsigned long start_time = io->start_time;
-       struct mapped_device *md = io->md;
-       struct bio *bio = io->orig_bio;
-       unsigned int sectors;
-
        /*
         * If REQ_PREFLUSH set, don't account payload, it will be
         * submitted (and accounted) after this flush completes.
         */
        if (bio_is_flush_with_data(bio))
-               sectors = 0;
-       else if (likely(!(dm_io_flagged(io, DM_IO_WAS_SPLIT))))
-               sectors = bio_sectors(bio);
-       else
-               sectors = io->sectors;
+               return 0;
+       if (unlikely(dm_io_flagged(io, DM_IO_WAS_SPLIT)))
+               return io->sectors;
+       return bio_sectors(bio);
+}
+
+static void dm_io_acct(struct dm_io *io, bool end)
+{
+       struct bio *bio = io->orig_bio;
 
        if (dm_io_flagged(io, DM_IO_BLK_STAT)) {
                if (!end)
                        bdev_start_io_acct(bio->bi_bdev, bio_op(bio),
-                                          start_time);
+                                          io->start_time);
                else
                        bdev_end_io_acct(bio->bi_bdev, bio_op(bio),
-                                        sectors, start_time);
+                                        dm_io_sectors(io, bio),
+                                        io->start_time);
        }
 
        if (static_branch_unlikely(&stats_enabled) &&
-           unlikely(dm_stats_used(&md->stats))) {
+           unlikely(dm_stats_used(&io->md->stats))) {
                sector_t sector;
 
-               if (likely(!dm_io_flagged(io, DM_IO_WAS_SPLIT)))
-                       sector = bio->bi_iter.bi_sector;
-               else
+               if (unlikely(dm_io_flagged(io, DM_IO_WAS_SPLIT)))
                        sector = bio_end_sector(bio) - io->sector_offset;
+               else
+                       sector = bio->bi_iter.bi_sector;
 
-               dm_stats_account_io(&md->stats, bio_data_dir(bio),
-                                   sector, sectors,
-                                   end, start_time, stats_aux);
+               dm_stats_account_io(&io->md->stats, bio_data_dir(bio),
+                                   sector, dm_io_sectors(io, bio),
+                                   end, io->start_time, &io->stats_aux);
        }
 }