lkml.org 
[lkml]   [2014]   [Jan]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.10 023/129] target/file: Update hw_max_sectors based on current block_size
    Date
    3.10-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Nicholas Bellinger <nab@linux-iscsi.org>

    commit 95cadace8f3959282e76ebf8b382bd0930807d2c upstream.

    This patch allows FILEIO to update hw_max_sectors based on the current
    max_bytes_per_io. This is required because vfs_[writev,readv]() can accept
    a maximum of 2048 iovecs per call, so the enforced hw_max_sectors really
    needs to be calculated based on block_size.

    This addresses a >= v3.5 bug where block_size=512 was rejecting > 1M
    sized I/O requests, because FD_MAX_SECTORS was hardcoded to 2048 for
    the block_size=4096 case.

    (v2: Use max_bytes_per_io instead of ->update_hw_max_sectors)

    Reported-by: Henrik Goldman <hg@x-formation.com>
    Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/target/target_core_device.c | 5 +++++
    drivers/target/target_core_file.c | 8 ++++----
    drivers/target/target_core_file.h | 5 ++++-
    include/target/target_core_base.h | 1 +
    4 files changed, 14 insertions(+), 5 deletions(-)

    --- a/drivers/target/target_core_device.c
    +++ b/drivers/target/target_core_device.c
    @@ -1078,6 +1078,11 @@ int se_dev_set_block_size(struct se_devi
    dev->dev_attrib.block_size = block_size;
    pr_debug("dev[%p]: SE Device block_size changed to %u\n",
    dev, block_size);
    +
    + if (dev->dev_attrib.max_bytes_per_io)
    + dev->dev_attrib.hw_max_sectors =
    + dev->dev_attrib.max_bytes_per_io / block_size;
    +
    return 0;
    }

    --- a/drivers/target/target_core_file.c
    +++ b/drivers/target/target_core_file.c
    @@ -66,9 +66,8 @@ static int fd_attach_hba(struct se_hba *
    pr_debug("CORE_HBA[%d] - TCM FILEIO HBA Driver %s on Generic"
    " Target Core Stack %s\n", hba->hba_id, FD_VERSION,
    TARGET_CORE_MOD_VERSION);
    - pr_debug("CORE_HBA[%d] - Attached FILEIO HBA: %u to Generic"
    - " MaxSectors: %u\n",
    - hba->hba_id, fd_host->fd_host_id, FD_MAX_SECTORS);
    + pr_debug("CORE_HBA[%d] - Attached FILEIO HBA: %u to Generic\n",
    + hba->hba_id, fd_host->fd_host_id);

    return 0;
    }
    @@ -220,7 +219,8 @@ static int fd_configure_device(struct se
    }

    dev->dev_attrib.hw_block_size = fd_dev->fd_block_size;
    - dev->dev_attrib.hw_max_sectors = FD_MAX_SECTORS;
    + dev->dev_attrib.max_bytes_per_io = FD_MAX_BYTES;
    + dev->dev_attrib.hw_max_sectors = FD_MAX_BYTES / fd_dev->fd_block_size;
    dev->dev_attrib.hw_queue_depth = FD_MAX_DEVICE_QUEUE_DEPTH;

    if (fd_dev->fbd_flags & FDBD_HAS_BUFFERED_IO_WCE) {
    --- a/drivers/target/target_core_file.h
    +++ b/drivers/target/target_core_file.h
    @@ -7,7 +7,10 @@
    #define FD_DEVICE_QUEUE_DEPTH 32
    #define FD_MAX_DEVICE_QUEUE_DEPTH 128
    #define FD_BLOCKSIZE 512
    -#define FD_MAX_SECTORS 2048
    +/*
    + * Limited by the number of iovecs (2048) per vfs_[writev,readv] call
    + */
    +#define FD_MAX_BYTES 8388608

    #define RRF_EMULATE_CDB 0x01
    #define RRF_GOT_LBA 0x02
    --- a/include/target/target_core_base.h
    +++ b/include/target/target_core_base.h
    @@ -614,6 +614,7 @@ struct se_dev_attrib {
    u32 unmap_granularity;
    u32 unmap_granularity_alignment;
    u32 max_write_same_len;
    + u32 max_bytes_per_io;
    struct se_device *da_dev;
    struct config_group da_group;
    };



    \
     
     \ /
      Last update: 2014-01-07 02:01    [W:4.316 / U:1.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site