• Mike Snitzer's avatar
    dm: fix IO splitting · 3ee16db3
    Mike Snitzer authored
    Commit 882ec4e6 ("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 5091cdec ("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: 882ec4e6 ("dm table: stack 'chunk_sectors' limit to account for target-specific splitting")
    Fixes: 5091cdec ("dm: change max_io_len() to use blk_max_size_offset()")
    Cc: stable@vger.kernel.org
    Reported-by: default avatarJohn Dorminy <jdorminy@redhat.com>
    Reported-by: default avatarBruce Johnston <bjohnsto@redhat.com>
    Reported-by: default avatarKirill Tkhai <ktkhai@virtuozzo.com>
    Reviewed-by: default avatarJohn Dorminy <jdorminy@redhat.com>
    Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
    Reviewed-by: default avatarJens Axboe <axboe@kernel.dk>
    3ee16db3
dm-table.c 47 KB