aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSagi Grimberg <sagig@mellanox.com>2016-02-29 12:07:34 -0500
committerDoug Ledford <dledford@redhat.com>2016-03-04 11:59:35 -0500
commit318d311e8f016dbbf22160d7b1c19a290a95ad9d (patch)
tree478975535990d19af8c5da05469acea3a2c49d0e
parentb005d316471374b1ff26df8c8460cc1ea9186647 (diff)
iser: Accept arbitrary sg lists mapping if the device supports it
If the device support arbitrary sg list mapping (device cap IB_DEVICE_SG_GAPS_REG set) we allocate the memory regions with IB_MR_TYPE_SG_GAPS and allow the block layer to pass us gaps by skip setting the queue virt_boundary. Signed-off-by: Sagi Grimberg <sagig@mellanox.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
-rw-r--r--drivers/infiniband/ulp/iser/iscsi_iser.c11
-rw-r--r--drivers/infiniband/ulp/iser/iser_verbs.c23
2 files changed, 25 insertions, 9 deletions
diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.c b/drivers/infiniband/ulp/iser/iscsi_iser.c
index c827c93f46c5..80b6bedc172f 100644
--- a/drivers/infiniband/ulp/iser/iscsi_iser.c
+++ b/drivers/infiniband/ulp/iser/iscsi_iser.c
@@ -969,7 +969,16 @@ static umode_t iser_attr_is_visible(int param_type, int param)
969 969
970static int iscsi_iser_slave_alloc(struct scsi_device *sdev) 970static int iscsi_iser_slave_alloc(struct scsi_device *sdev)
971{ 971{
972 blk_queue_virt_boundary(sdev->request_queue, ~MASK_4K); 972 struct iscsi_session *session;
973 struct iser_conn *iser_conn;
974 struct ib_device *ib_dev;
975
976 session = starget_to_session(scsi_target(sdev))->dd_data;
977 iser_conn = session->leadconn->dd_data;
978 ib_dev = iser_conn->ib_conn.device->ib_device;
979
980 if (!(ib_dev->attrs.device_cap_flags & IB_DEVICE_SG_GAPS_REG))
981 blk_queue_virt_boundary(sdev->request_queue, ~MASK_4K);
973 982
974 return 0; 983 return 0;
975} 984}
diff --git a/drivers/infiniband/ulp/iser/iser_verbs.c b/drivers/infiniband/ulp/iser/iser_verbs.c
index 40c0f4978e2f..f21bdcc34d59 100644
--- a/drivers/infiniband/ulp/iser/iser_verbs.c
+++ b/drivers/infiniband/ulp/iser/iser_verbs.c
@@ -252,14 +252,21 @@ void iser_free_fmr_pool(struct ib_conn *ib_conn)
252} 252}
253 253
254static int 254static int
255iser_alloc_reg_res(struct ib_device *ib_device, 255iser_alloc_reg_res(struct iser_device *device,
256 struct ib_pd *pd, 256 struct ib_pd *pd,
257 struct iser_reg_resources *res, 257 struct iser_reg_resources *res,
258 unsigned int size) 258 unsigned int size)
259{ 259{
260 struct ib_device *ib_dev = device->ib_device;
261 enum ib_mr_type mr_type;
260 int ret; 262 int ret;
261 263
262 res->mr = ib_alloc_mr(pd, IB_MR_TYPE_MEM_REG, size); 264 if (ib_dev->attrs.device_cap_flags & IB_DEVICE_SG_GAPS_REG)
265 mr_type = IB_MR_TYPE_SG_GAPS;
266 else
267 mr_type = IB_MR_TYPE_MEM_REG;
268
269 res->mr = ib_alloc_mr(pd, mr_type, size);
263 if (IS_ERR(res->mr)) { 270 if (IS_ERR(res->mr)) {
264 ret = PTR_ERR(res->mr); 271 ret = PTR_ERR(res->mr);
265 iser_err("Failed to allocate ib_fast_reg_mr err=%d\n", ret); 272 iser_err("Failed to allocate ib_fast_reg_mr err=%d\n", ret);
@@ -277,7 +284,7 @@ iser_free_reg_res(struct iser_reg_resources *rsc)
277} 284}
278 285
279static int 286static int
280iser_alloc_pi_ctx(struct ib_device *ib_device, 287iser_alloc_pi_ctx(struct iser_device *device,
281 struct ib_pd *pd, 288 struct ib_pd *pd,
282 struct iser_fr_desc *desc, 289 struct iser_fr_desc *desc,
283 unsigned int size) 290 unsigned int size)
@@ -291,7 +298,7 @@ iser_alloc_pi_ctx(struct ib_device *ib_device,
291 298
292 pi_ctx = desc->pi_ctx; 299 pi_ctx = desc->pi_ctx;
293 300
294 ret = iser_alloc_reg_res(ib_device, pd, &pi_ctx->rsc, size); 301 ret = iser_alloc_reg_res(device, pd, &pi_ctx->rsc, size);
295 if (ret) { 302 if (ret) {
296 iser_err("failed to allocate reg_resources\n"); 303 iser_err("failed to allocate reg_resources\n");
297 goto alloc_reg_res_err; 304 goto alloc_reg_res_err;
@@ -324,7 +331,7 @@ iser_free_pi_ctx(struct iser_pi_context *pi_ctx)
324} 331}
325 332
326static struct iser_fr_desc * 333static struct iser_fr_desc *
327iser_create_fastreg_desc(struct ib_device *ib_device, 334iser_create_fastreg_desc(struct iser_device *device,
328 struct ib_pd *pd, 335 struct ib_pd *pd,
329 bool pi_enable, 336 bool pi_enable,
330 unsigned int size) 337 unsigned int size)
@@ -336,12 +343,12 @@ iser_create_fastreg_desc(struct ib_device *ib_device,
336 if (!desc) 343 if (!desc)
337 return ERR_PTR(-ENOMEM); 344 return ERR_PTR(-ENOMEM);
338 345
339 ret = iser_alloc_reg_res(ib_device, pd, &desc->rsc, size); 346 ret = iser_alloc_reg_res(device, pd, &desc->rsc, size);
340 if (ret) 347 if (ret)
341 goto reg_res_alloc_failure; 348 goto reg_res_alloc_failure;
342 349
343 if (pi_enable) { 350 if (pi_enable) {
344 ret = iser_alloc_pi_ctx(ib_device, pd, desc, size); 351 ret = iser_alloc_pi_ctx(device, pd, desc, size);
345 if (ret) 352 if (ret)
346 goto pi_ctx_alloc_failure; 353 goto pi_ctx_alloc_failure;
347 } 354 }
@@ -374,7 +381,7 @@ int iser_alloc_fastreg_pool(struct ib_conn *ib_conn,
374 spin_lock_init(&fr_pool->lock); 381 spin_lock_init(&fr_pool->lock);
375 fr_pool->size = 0; 382 fr_pool->size = 0;
376 for (i = 0; i < cmds_max; i++) { 383 for (i = 0; i < cmds_max; i++) {
377 desc = iser_create_fastreg_desc(device->ib_device, device->pd, 384 desc = iser_create_fastreg_desc(device, device->pd,
378 ib_conn->pi_support, size); 385 ib_conn->pi_support, size);
379 if (IS_ERR(desc)) { 386 if (IS_ERR(desc)) {
380 ret = PTR_ERR(desc); 387 ret = PTR_ERR(desc);