aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Snitzer <snitzer@redhat.com>2018-10-10 12:01:55 -0400
committerMike Snitzer <snitzer@redhat.com>2018-10-10 12:11:09 -0400
commitbeb9caac211c1be1bc118bb62d5cf09c4107e6a5 (patch)
tree96442a261a24e3795cb1d3deecd3bdc3943dbc5b
parent9864cd5dc54cade89fd4b0954c2e522841aa247c (diff)
dm linear: eliminate linear_end_io call if CONFIG_DM_ZONED disabled
It is best to avoid any extra overhead associated with bio completion. DM core will indirectly call a DM target's .end_io if it is defined. In the case of DM linear, there is no need to do so (for every bio that completes) if CONFIG_DM_ZONED is not enabled. Avoiding an extra indirect call for every bio completion is very important for ensuring DM linear doesn't incur more overhead that further widens the performance gap between dm-linear and raw block devices. Fixes: 0be12c1c7fce7 ("dm linear: add support for zoned block devices") Cc: stable@vger.kernel.org Signed-off-by: Mike Snitzer <snitzer@redhat.com>
-rw-r--r--drivers/md/dm-linear.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/md/dm-linear.c b/drivers/md/dm-linear.c
index d10964d41fd7..172f6fa83c0d 100644
--- a/drivers/md/dm-linear.c
+++ b/drivers/md/dm-linear.c
@@ -102,6 +102,7 @@ static int linear_map(struct dm_target *ti, struct bio *bio)
102 return DM_MAPIO_REMAPPED; 102 return DM_MAPIO_REMAPPED;
103} 103}
104 104
105#ifdef CONFIG_DM_ZONED
105static int linear_end_io(struct dm_target *ti, struct bio *bio, 106static int linear_end_io(struct dm_target *ti, struct bio *bio,
106 blk_status_t *error) 107 blk_status_t *error)
107{ 108{
@@ -112,6 +113,7 @@ static int linear_end_io(struct dm_target *ti, struct bio *bio,
112 113
113 return DM_ENDIO_DONE; 114 return DM_ENDIO_DONE;
114} 115}
116#endif
115 117
116static void linear_status(struct dm_target *ti, status_type_t type, 118static void linear_status(struct dm_target *ti, status_type_t type,
117 unsigned status_flags, char *result, unsigned maxlen) 119 unsigned status_flags, char *result, unsigned maxlen)
@@ -208,12 +210,16 @@ static size_t linear_dax_copy_to_iter(struct dm_target *ti, pgoff_t pgoff,
208static struct target_type linear_target = { 210static struct target_type linear_target = {
209 .name = "linear", 211 .name = "linear",
210 .version = {1, 4, 0}, 212 .version = {1, 4, 0},
213#ifdef CONFIG_DM_ZONED
214 .end_io = linear_end_io,
211 .features = DM_TARGET_PASSES_INTEGRITY | DM_TARGET_ZONED_HM, 215 .features = DM_TARGET_PASSES_INTEGRITY | DM_TARGET_ZONED_HM,
216#else
217 .features = DM_TARGET_PASSES_INTEGRITY,
218#endif
212 .module = THIS_MODULE, 219 .module = THIS_MODULE,
213 .ctr = linear_ctr, 220 .ctr = linear_ctr,
214 .dtr = linear_dtr, 221 .dtr = linear_dtr,
215 .map = linear_map, 222 .map = linear_map,
216 .end_io = linear_end_io,
217 .status = linear_status, 223 .status = linear_status,
218 .prepare_ioctl = linear_prepare_ioctl, 224 .prepare_ioctl = linear_prepare_ioctl,
219 .iterate_devices = linear_iterate_devices, 225 .iterate_devices = linear_iterate_devices,