diff options
author | Bart Van Assche <bart.vanassche@sandisk.com> | 2017-02-14 13:56:29 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-03-14 22:02:44 -0400 |
commit | 516a12ab11bdd66104b1775a097a9a28c311cecb (patch) | |
tree | df88ad2a10db446b0518f3ea837442615dfa1fef | |
parent | 04f16db056d035785f217f1b958fe49ca3cd9be5 (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.c | 12 |
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 | ||