if the rdma device supports sg gaps, we don't need to set a virtual boundary but we then need to explicitly set the max_segment_size, otherwise scsi takes BLK_MAX_SEGMENT_SIZE and sets it using dma_set_max_seg_size() and this affects all the rdma device consumers. Fix it by setting shost max_segment_size according to the device capability if SG_GAPS are not supported. Reported-by: Jason Gunthorpe <jgg@xxxxxxxx> Suggested-by: Christoph Hellwig <hch@xxxxxx> Signed-off-by: Sagi Grimberg <sagi@xxxxxxxxxxx> --- Changes from v1: - set max_segment_size only for non virtual boundary devices drivers/infiniband/ulp/iser/iscsi_iser.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.c b/drivers/infiniband/ulp/iser/iscsi_iser.c index 841b66397a57..a3a4b956bbb9 100644 --- a/drivers/infiniband/ulp/iser/iscsi_iser.c +++ b/drivers/infiniband/ulp/iser/iscsi_iser.c @@ -653,7 +653,9 @@ iscsi_iser_session_create(struct iscsi_endpoint *ep, SHOST_DIX_GUARD_CRC); } - if (!(ib_dev->attrs.device_cap_flags & IB_DEVICE_SG_GAPS_REG)) + if (ib_dev->attrs.device_cap_flags & IB_DEVICE_SG_GAPS_REG) + shost->max_segment_size = ib_dma_max_seg_size(ib_dev); + else shost->virt_boundary_mask = ~MASK_4K; if (iscsi_host_add(shost, ib_dev->dev.parent)) { -- 2.17.1