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

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
...@@ -508,30 +508,28 @@ static void dm_io_acct(struct dm_io *io, bool end) ...@@ -508,30 +508,28 @@ static void dm_io_acct(struct dm_io *io, bool end)
unsigned long start_time = io->start_time; unsigned long start_time = io->start_time;
struct mapped_device *md = io->md; struct mapped_device *md = io->md;
struct bio *bio = io->orig_bio; struct bio *bio = io->orig_bio;
bool is_flush_with_data; unsigned int sectors;
unsigned int bi_size;
/* If REQ_PREFLUSH set save any payload but do not account it */ /*
is_flush_with_data = bio_is_flush_with_data(bio); * If REQ_PREFLUSH set, don't account payload, it will be
if (is_flush_with_data) { * submitted (and accounted) after this flush completes.
bi_size = bio->bi_iter.bi_size; */
bio->bi_iter.bi_size = 0; if (bio_is_flush_with_data(bio))
} sectors = 0;
else
sectors = bio_sectors(bio);
if (!end) if (!end)
bio_start_io_acct_time(bio, start_time); bdev_start_io_acct(bio->bi_bdev, sectors, bio_op(bio),
start_time);
else 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) && if (static_branch_unlikely(&stats_enabled) &&
unlikely(dm_stats_used(&md->stats))) unlikely(dm_stats_used(&md->stats)))
dm_stats_account_io(&md->stats, bio_data_dir(bio), 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); 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) static void __dm_start_io_acct(struct dm_io *io)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment