]> git.baikalelectronics.ru Git - kernel.git/commit
dm: fix IO splitting
authorMike Snitzer <snitzer@redhat.com>
Mon, 30 Nov 2020 15:57:43 +0000 (10:57 -0500)
committerMike Snitzer <snitzer@redhat.com>
Fri, 4 Dec 2020 19:53:15 +0000 (14:53 -0500)
commit23cb14b3e984547e2846136a011dbcb95a14542d
tree2a34d72f6ef06b6708c8ae56577baa2c9506002b
parent7fbfb25ba6d72eccf461d819d550c2aff88f12be
dm: fix IO splitting

Commit 6266d7e8aa36 ("dm table: stack 'chunk_sectors' limit to account
for target-specific splitting") caused a couple regressions:
1) Using lcm_not_zero() when stacking chunk_sectors was a bug because
   chunk_sectors must reflect the most limited of all devices in the
   IO stack.
2) DM targets that set max_io_len but that do _not_ provide an
   .iterate_devices method no longer had there IO split properly.

And commit 4f323e626106 ("dm: change max_io_len() to use
blk_max_size_offset()") also caused a regression where DM no longer
supported varied (per target) IO splitting. The implication being the
potential for severely reduced performance for IO stacks that use a DM
target like dm-cache to hide performance limitations of a slower
device (e.g. one that requires 4K IO splitting).

Coming full circle: Fix all these issues by discontinuing stacking
chunk_sectors up using ti->max_io_len in dm_calculate_queue_limits(),
add optional chunk_sectors override argument to blk_max_size_offset()
and update DM's max_io_len() to pass ti->max_io_len to its
blk_max_size_offset() call.

Passing in an optional chunk_sectors override to blk_max_size_offset()
allows for code reuse of block's centralized calculation for max IO
size based on provided offset and split boundary.

Fixes: 6266d7e8aa36 ("dm table: stack 'chunk_sectors' limit to account for target-specific splitting")
Fixes: 4f323e626106 ("dm: change max_io_len() to use blk_max_size_offset()")
Cc: stable@vger.kernel.org
Reported-by: John Dorminy <jdorminy@redhat.com>
Reported-by: Bruce Johnston <bjohnsto@redhat.com>
Reported-by: Kirill Tkhai <ktkhai@virtuozzo.com>
Reviewed-by: John Dorminy <jdorminy@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Reviewed-by: Jens Axboe <axboe@kernel.dk>
block/blk-merge.c
drivers/md/dm-table.c
drivers/md/dm.c
include/linux/blkdev.h