diff options
author | Mike Snitzer <snitzer@redhat.com> | 2022-02-20 18:57:11 +0100 |
---|---|---|
committer | Mike Snitzer <snitzer@redhat.com> | 2022-02-21 21:36:18 +0100 |
commit | 0ab30b4079e103b517bdfc4331507bf8d8dd8f7b (patch) | |
tree | 21e80e1a46d75b9673c136e855e59f4f164af36c /drivers/md/dm.c | |
parent | dm stats: fix too short end duration_ns when using precise_timestamps (diff) | |
download | linux-0ab30b4079e103b517bdfc4331507bf8d8dd8f7b.tar.xz linux-0ab30b4079e103b517bdfc4331507bf8d8dd8f7b.zip |
dm: eliminate copying of dm_io fields in dm_io_dec_pending
There is no need for dm_io_dec_pending() to copy dm_io fields
anymore now that DM provides its own pending_io counters again.
The race documented in commit d208b89401e0 ("dm: fix mempool NULL
pointer race when completing IO") no longer exists now that block
core's in_flight counters aren't used to signal all dm_io is
complete.
Also, rename {start,end}_io_acct to dm_{start,end}_io_acct.
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Diffstat (limited to 'drivers/md/dm.c')
-rw-r--r-- | drivers/md/dm.c | 19 |
1 files changed, 7 insertions, 12 deletions
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 3ae76900023b..33376e679ef5 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -518,15 +518,14 @@ static void dm_io_acct(bool end, struct mapped_device *md, struct bio *bio, bio->bi_iter.bi_size = bi_size; } -static void start_io_acct(struct dm_io *io) +static void dm_start_io_acct(struct dm_io *io) { dm_io_acct(false, io->md, io->orig_bio, io->start_time, &io->stats_aux); } -static void end_io_acct(struct mapped_device *md, struct bio *bio, - unsigned long start_time, struct dm_stats_aux *stats_aux) +static void dm_end_io_acct(struct dm_io *io) { - dm_io_acct(true, md, bio, start_time, stats_aux); + dm_io_acct(true, io->md, io->orig_bio, io->start_time, &io->stats_aux); } static struct dm_io *alloc_io(struct mapped_device *md, struct bio *bio) @@ -808,8 +807,6 @@ void dm_io_dec_pending(struct dm_io *io, blk_status_t error) blk_status_t io_error; struct bio *bio; struct mapped_device *md = io->md; - unsigned long start_time = 0; - struct dm_stats_aux stats_aux; /* Push-back supersedes any I/O errors */ if (unlikely(error)) { @@ -841,10 +838,8 @@ void dm_io_dec_pending(struct dm_io *io, blk_status_t error) } io_error = io->status; - start_time = io->start_time; - stats_aux = io->stats_aux; + dm_end_io_acct(io); free_io(md, io); - end_io_acct(md, bio, start_time, &stats_aux); smp_wmb(); this_cpu_dec(*md->pending_io); @@ -1444,8 +1439,8 @@ static void __split_and_process_bio(struct mapped_device *md, * so that it gets handled *after* bios already submitted * have been completely processed. * We take a clone of the original to store in - * ci.io->orig_bio to be used by end_io_acct() and - * for dec_pending to use for completion handling. + * ci.io->orig_bio to be used by dm_end_io_acct() and + * for dm_io_dec_pending() to use for completion handling. */ struct bio *b = bio_split(bio, bio_sectors(bio) - ci.sector_count, GFP_NOIO, &md->queue->bio_split); @@ -1456,7 +1451,7 @@ static void __split_and_process_bio(struct mapped_device *md, submit_bio_noacct(bio); } } - start_io_acct(ci.io); + dm_start_io_acct(ci.io); /* drop the extra reference count */ dm_io_dec_pending(ci.io, errno_to_blk_status(error)); |