Commit 06eed768 authored by Mike Snitzer's avatar Mike Snitzer
Browse files

dm: avoid needless dm_io access if all IO accounting is disabled



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: default avatarMike Snitzer <snitzer@kernel.org>
parent 526d1006
Loading
Loading
Loading
Loading
+21 −22
Original line number Diff line number Diff line
@@ -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);
	}
}