diff options
author | Sagi Grimberg <sagig@mellanox.com> | 2016-02-29 12:07:34 -0500 |
---|---|---|
committer | Doug Ledford <dledford@redhat.com> | 2016-03-04 11:59:35 -0500 |
commit | 318d311e8f016dbbf22160d7b1c19a290a95ad9d (patch) | |
tree | 478975535990d19af8c5da05469acea3a2c49d0e | |
parent | b005d316471374b1ff26df8c8460cc1ea9186647 (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.c | 11 | ||||
-rw-r--r-- | drivers/infiniband/ulp/iser/iser_verbs.c | 23 |
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 | ||
970 | static int iscsi_iser_slave_alloc(struct scsi_device *sdev) | 970 | static 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 | ||
254 | static int | 254 | static int |
255 | iser_alloc_reg_res(struct ib_device *ib_device, | 255 | iser_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 | ||
279 | static int | 286 | static int |
280 | iser_alloc_pi_ctx(struct ib_device *ib_device, | 287 | iser_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 | ||
326 | static struct iser_fr_desc * | 333 | static struct iser_fr_desc * |
327 | iser_create_fastreg_desc(struct ib_device *ib_device, | 334 | iser_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); |