Skip to content
Snippets Groups Projects
  • Paolo Bonzini's avatar
    cc071629
    block: introduce max_hw_iov for use in scsi-generic · cc071629
    Paolo Bonzini authored
    
    Linux limits the size of iovecs to 1024 (UIO_MAXIOV in the kernel
    sources, IOV_MAX in POSIX).  Because of this, on some host adapters
    requests with many iovecs are rejected with -EINVAL by the
    io_submit() or readv()/writev() system calls.
    
    In fact, the same limit applies to SG_IO as well.  To fix both the
    EINVAL and the possible performance issues from using fewer iovecs
    than allowed by Linux (some HBAs have max_segments as low as 128),
    introduce a separate entry in BlockLimits to hold the max_segments
    value from sysfs.  This new limit is used only for SG_IO and clamped
    to bs->bl.max_iov anyway, just like max_hw_transfer is clamped to
    bs->bl.max_transfer.
    
    Reported-by: default avatarHalil Pasic <pasic@linux.ibm.com>
    Cc: Hanna Reitz <hreitz@redhat.com>
    Cc: Kevin Wolf <kwolf@redhat.com>
    Cc: qemu-block@nongnu.org
    Cc: qemu-stable@nongnu.org
    Fixes: 18473467 ("file-posix: try BLKSECTGET on block devices too, do not round to power of 2", 2021-06-25)
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    Message-Id: <20210923130436.1187591-1-pbonzini@redhat.com>
    Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
    cc071629
    History
    block: introduce max_hw_iov for use in scsi-generic
    Paolo Bonzini authored
    
    Linux limits the size of iovecs to 1024 (UIO_MAXIOV in the kernel
    sources, IOV_MAX in POSIX).  Because of this, on some host adapters
    requests with many iovecs are rejected with -EINVAL by the
    io_submit() or readv()/writev() system calls.
    
    In fact, the same limit applies to SG_IO as well.  To fix both the
    EINVAL and the possible performance issues from using fewer iovecs
    than allowed by Linux (some HBAs have max_segments as low as 128),
    introduce a separate entry in BlockLimits to hold the max_segments
    value from sysfs.  This new limit is used only for SG_IO and clamped
    to bs->bl.max_iov anyway, just like max_hw_transfer is clamped to
    bs->bl.max_transfer.
    
    Reported-by: default avatarHalil Pasic <pasic@linux.ibm.com>
    Cc: Hanna Reitz <hreitz@redhat.com>
    Cc: Kevin Wolf <kwolf@redhat.com>
    Cc: qemu-block@nongnu.org
    Cc: qemu-stable@nongnu.org
    Fixes: 18473467 ("file-posix: try BLKSECTGET on block devices too, do not round to power of 2", 2021-06-25)
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    Message-Id: <20210923130436.1187591-1-pbonzini@redhat.com>
    Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>