aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBart Van Assche <bart.vanassche@sandisk.com>2017-02-14 13:56:29 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-03-14 22:02:44 -0400
commit516a12ab11bdd66104b1775a097a9a28c311cecb (patch)
treedf88ad2a10db446b0518f3ea837442615dfa1fef
parent04f16db056d035785f217f1b958fe49ca3cd9be5 (diff)
IB/SRP: Avoid using IB_MR_TYPE_SG_GAPS
commit d6c58dc40fec35ff6cdb350b53bce0fcf9143709 upstream. Tests have shown that the following error message is reported when using SG-GAPS registration with an mlx5 adapter: scsi host1: ib_srp: failed RECV status WR flushed (5) for CQE ffff880bd4270eb0 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 0f007806 2500002a ad9fafd1 scsi host1: ib_srp: reconnect succeeded mlx5_0:dump_cqe:262:(pid 7369): dump error cqe 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 0f007806 25000032 00105dd0 scsi host1: ib_srp: failed FAST REG status memory management operation error (6) for CQE ffff880b92860138 Hence avoid using SG-GAPS memory registrations. Additionally, always configure the blk_queue_virt_boundary() to avoid to trigger a mapping failure when using adapters that support SG-GAPS (e.g. mlx5). Fixes: commit ad8e66b4a801 ("IB/srp: fix mr allocation when the device supports sg gaps") Fixes: commit 509c5f33f4f6 ("IB/srp: Prevent mapping failures") Reported-by: Laurence Oberman <loberman@redhat.com> Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com> Cc: Israel Rukshin <israelr@mellanox.com> Cc: Max Gurtovoy <maxg@mellanox.com> Cc: Leon Romanovsky <leonro@mellanox.com> Cc: Mark Bloch <markb@mellanox.com> Cc: Yuval Shaia <yuval.shaia@oracle.com> Signed-off-by: Doug Ledford <dledford@redhat.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/infiniband/ulp/srp/ib_srp.c12
1 files changed, 3 insertions, 9 deletions
diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c
index e7dcf14a76e2..97247582eaa6 100644
--- a/drivers/infiniband/ulp/srp/ib_srp.c
+++ b/drivers/infiniband/ulp/srp/ib_srp.c
@@ -366,7 +366,6 @@ static struct srp_fr_pool *srp_create_fr_pool(struct ib_device *device,
366 struct srp_fr_desc *d; 366 struct srp_fr_desc *d;
367 struct ib_mr *mr; 367 struct ib_mr *mr;
368 int i, ret = -EINVAL; 368 int i, ret = -EINVAL;
369 enum ib_mr_type mr_type;
370 369
371 if (pool_size <= 0) 370 if (pool_size <= 0)
372 goto err; 371 goto err;
@@ -380,13 +379,9 @@ static struct srp_fr_pool *srp_create_fr_pool(struct ib_device *device,
380 spin_lock_init(&pool->lock); 379 spin_lock_init(&pool->lock);
381 INIT_LIST_HEAD(&pool->free_list); 380 INIT_LIST_HEAD(&pool->free_list);
382 381
383 if (device->attrs.device_cap_flags & IB_DEVICE_SG_GAPS_REG)
384 mr_type = IB_MR_TYPE_SG_GAPS;
385 else
386 mr_type = IB_MR_TYPE_MEM_REG;
387
388 for (i = 0, d = &pool->desc[0]; i < pool->size; i++, d++) { 382 for (i = 0, d = &pool->desc[0]; i < pool->size; i++, d++) {
389 mr = ib_alloc_mr(pd, mr_type, max_page_list_len); 383 mr = ib_alloc_mr(pd, IB_MR_TYPE_MEM_REG,
384 max_page_list_len);
390 if (IS_ERR(mr)) { 385 if (IS_ERR(mr)) {
391 ret = PTR_ERR(mr); 386 ret = PTR_ERR(mr);
392 goto destroy_pool; 387 goto destroy_pool;
@@ -2652,9 +2647,8 @@ static int srp_slave_alloc(struct scsi_device *sdev)
2652 struct Scsi_Host *shost = sdev->host; 2647 struct Scsi_Host *shost = sdev->host;
2653 struct srp_target_port *target = host_to_target(shost); 2648 struct srp_target_port *target = host_to_target(shost);
2654 struct srp_device *srp_dev = target->srp_host->srp_dev; 2649 struct srp_device *srp_dev = target->srp_host->srp_dev;
2655 struct ib_device *ibdev = srp_dev->dev;
2656 2650
2657 if (!(ibdev->attrs.device_cap_flags & IB_DEVICE_SG_GAPS_REG)) 2651 if (true)
2658 blk_queue_virt_boundary(sdev->request_queue, 2652 blk_queue_virt_boundary(sdev->request_queue,
2659 ~srp_dev->mr_page_mask); 2653 ~srp_dev->mr_page_mask);
2660 2654