aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/ulp
diff options
context:
space:
mode:
authorOr Gerlitz <ogerlitz@mellanox.com>2013-02-21 09:50:10 -0500
committerRoland Dreier <roland@purestorage.com>2013-02-22 03:22:30 -0500
commit5525d210fd55952262f30ba45b2acceb4a6a50e9 (patch)
tree858e10e755213533151c142e919d25a4aac3f0b5 /drivers/infiniband/ulp
parent819a087316a63ef7d60e7b816d18c4e29a05861a (diff)
IB/iser: Enable iser when FMRs are not supported
Reuse the "SG unaligned for FMR" driver flow to make the initiator functional when running over driver instance which doesn't support FMRs, such as a mlx4 virtual function. Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> Signed-off-by: Alex Tabachnik <alext@mellanox.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
Diffstat (limited to 'drivers/infiniband/ulp')
-rw-r--r--drivers/infiniband/ulp/iser/iser_memory.c7
-rw-r--r--drivers/infiniband/ulp/iser/iser_verbs.c8
2 files changed, 10 insertions, 5 deletions
diff --git a/drivers/infiniband/ulp/iser/iser_memory.c b/drivers/infiniband/ulp/iser/iser_memory.c
index 79c4f35ba0c9..be1edb04b085 100644
--- a/drivers/infiniband/ulp/iser/iser_memory.c
+++ b/drivers/infiniband/ulp/iser/iser_memory.c
@@ -369,10 +369,11 @@ int iser_reg_rdma_mem(struct iscsi_iser_task *iser_task,
369 regd_buf = &iser_task->rdma_regd[cmd_dir]; 369 regd_buf = &iser_task->rdma_regd[cmd_dir];
370 370
371 aligned_len = iser_data_buf_aligned_len(mem, ibdev); 371 aligned_len = iser_data_buf_aligned_len(mem, ibdev);
372 if (aligned_len != mem->dma_nents) { 372 if (aligned_len != mem->dma_nents ||
373 (!ib_conn->fmr_pool && mem->dma_nents > 1)) {
373 iscsi_conn->fmr_unalign_cnt++; 374 iscsi_conn->fmr_unalign_cnt++;
374 iser_warn("rdma alignment violation %d/%d aligned\n", 375 iser_warn("rdma alignment violation (%d/%d aligned) or FMR not supported\n",
375 aligned_len, mem->size); 376 aligned_len, mem->size);
376 iser_data_buf_dump(mem, ibdev); 377 iser_data_buf_dump(mem, ibdev);
377 378
378 /* unmap the command data before accessing it */ 379 /* unmap the command data before accessing it */
diff --git a/drivers/infiniband/ulp/iser/iser_verbs.c b/drivers/infiniband/ulp/iser/iser_verbs.c
index 95a49affee44..4debadc53106 100644
--- a/drivers/infiniband/ulp/iser/iser_verbs.c
+++ b/drivers/infiniband/ulp/iser/iser_verbs.c
@@ -242,10 +242,14 @@ static int iser_create_ib_conn_res(struct iser_conn *ib_conn)
242 IB_ACCESS_REMOTE_READ); 242 IB_ACCESS_REMOTE_READ);
243 243
244 ib_conn->fmr_pool = ib_create_fmr_pool(device->pd, &params); 244 ib_conn->fmr_pool = ib_create_fmr_pool(device->pd, &params);
245 if (IS_ERR(ib_conn->fmr_pool)) { 245 ret = PTR_ERR(ib_conn->fmr_pool);
246 ret = PTR_ERR(ib_conn->fmr_pool); 246 if (IS_ERR(ib_conn->fmr_pool) && ret != -ENOSYS) {
247 ib_conn->fmr_pool = NULL; 247 ib_conn->fmr_pool = NULL;
248 goto out_err; 248 goto out_err;
249 } else if (ret == -ENOSYS) {
250 ib_conn->fmr_pool = NULL;
251 iser_warn("FMRs are not supported, using unaligned mode\n");
252 ret = 0;
249 } 253 }
250 254
251 memset(&init_attr, 0, sizeof init_attr); 255 memset(&init_attr, 0, sizeof init_attr);