Commit d3de6d12 authored by Ming Lei's avatar Ming Lei Committed by Mike Snitzer
Browse files

dm: switch to bdev based IO accounting interfaces



DM splits flush with data into empty flush followed by bio with data
payload, switch dm_io_acct() to use bdev_{start,end}_io_acct() to do
this accoiunting more naturally (rather than temporarily changing the
bio's bi_size).

This will allow DM to more easily account bios that are split (in
following commit).

Signed-off-by: default avatarMing Lei <ming.lei@redhat.com>
Signed-off-by: default avatarMike Snitzer <snitzer@kernel.org>
parent e6926ad0
Loading
Loading
Loading
Loading
+13 −15
Original line number Diff line number Diff line
@@ -508,30 +508,28 @@ static void dm_io_acct(struct dm_io *io, bool end)
	unsigned long start_time = io->start_time;
	struct mapped_device *md = io->md;
	struct bio *bio = io->orig_bio;
	bool is_flush_with_data;
	unsigned int bi_size;
	unsigned int sectors;

	/* If REQ_PREFLUSH set save any payload but do not account it */
	is_flush_with_data = bio_is_flush_with_data(bio);
	if (is_flush_with_data) {
		bi_size = bio->bi_iter.bi_size;
		bio->bi_iter.bi_size = 0;
	}
	/*
	 * 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
		sectors = bio_sectors(bio);

	if (!end)
		bio_start_io_acct_time(bio, start_time);
		bdev_start_io_acct(bio->bi_bdev, sectors, bio_op(bio),
				   start_time);
	else
		bio_end_io_acct(bio, start_time);
		bdev_end_io_acct(bio->bi_bdev, bio_op(bio), start_time);

	if (static_branch_unlikely(&stats_enabled) &&
	    unlikely(dm_stats_used(&md->stats)))
		dm_stats_account_io(&md->stats, bio_data_dir(bio),
				    bio->bi_iter.bi_sector, bio_sectors(bio),
				    bio->bi_iter.bi_sector, sectors,
				    end, start_time, stats_aux);

	/* Restore bio's payload so it does get accounted upon requeue */
	if (is_flush_with_data)
		bio->bi_iter.bi_size = bi_size;
}

static void __dm_start_io_acct(struct dm_io *io)