aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSagi Grimberg <sagig@mellanox.com>2014-01-23 05:31:28 -0500
committerRoland Dreier <roland@purestorage.com>2014-03-18 01:33:54 -0400
commitdb523b8de13545488b6ff6c952b4527596f3c16a (patch)
treeed8c134a1d13ac69b09b479fa5cee56a23980aac
parentcfbf8d4857c26a8a307fb7cd258074c9dcd8c691 (diff)
IB/iser: Suppress completions for fast registration work requests
In case iSER uses fast registration method, it should not request for successful completions on fast registration nor local invalidate requests. We color wr_id with ISER_FRWR_LI_WRID in order to correctly consume error completions. Signed-off-by: Sagi Grimberg <sagig@mellanox.com> Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
-rw-r--r--drivers/infiniband/ulp/iser/iscsi_iser.h2
-rw-r--r--drivers/infiniband/ulp/iser/iser_memory.c15
-rw-r--r--drivers/infiniband/ulp/iser/iser_verbs.c14
3 files changed, 12 insertions, 19 deletions
diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.h b/drivers/infiniband/ulp/iser/iscsi_iser.h
index 67914027c614..e1a01c6e6e12 100644
--- a/drivers/infiniband/ulp/iser/iscsi_iser.h
+++ b/drivers/infiniband/ulp/iser/iscsi_iser.h
@@ -138,6 +138,8 @@
138#define ISER_WSV 0x08 138#define ISER_WSV 0x08
139#define ISER_RSV 0x04 139#define ISER_RSV 0x04
140 140
141#define ISER_FRWR_LI_WRID 0xffffffffffffffffULL
142
141struct iser_hdr { 143struct iser_hdr {
142 u8 flags; 144 u8 flags;
143 u8 rsvd[3]; 145 u8 rsvd[3];
diff --git a/drivers/infiniband/ulp/iser/iser_memory.c b/drivers/infiniband/ulp/iser/iser_memory.c
index 1ce0c97d2ccb..f7701795cef2 100644
--- a/drivers/infiniband/ulp/iser/iser_memory.c
+++ b/drivers/infiniband/ulp/iser/iser_memory.c
@@ -457,8 +457,8 @@ static int iser_fast_reg_mr(struct fast_reg_descriptor *desc,
457 457
458 if (!desc->valid) { 458 if (!desc->valid) {
459 memset(&inv_wr, 0, sizeof(inv_wr)); 459 memset(&inv_wr, 0, sizeof(inv_wr));
460 inv_wr.wr_id = ISER_FRWR_LI_WRID;
460 inv_wr.opcode = IB_WR_LOCAL_INV; 461 inv_wr.opcode = IB_WR_LOCAL_INV;
461 inv_wr.send_flags = IB_SEND_SIGNALED;
462 inv_wr.ex.invalidate_rkey = desc->data_mr->rkey; 462 inv_wr.ex.invalidate_rkey = desc->data_mr->rkey;
463 wr = &inv_wr; 463 wr = &inv_wr;
464 /* Bump the key */ 464 /* Bump the key */
@@ -468,8 +468,8 @@ static int iser_fast_reg_mr(struct fast_reg_descriptor *desc,
468 468
469 /* Prepare FASTREG WR */ 469 /* Prepare FASTREG WR */
470 memset(&fastreg_wr, 0, sizeof(fastreg_wr)); 470 memset(&fastreg_wr, 0, sizeof(fastreg_wr));
471 fastreg_wr.wr_id = ISER_FRWR_LI_WRID;
471 fastreg_wr.opcode = IB_WR_FAST_REG_MR; 472 fastreg_wr.opcode = IB_WR_FAST_REG_MR;
472 fastreg_wr.send_flags = IB_SEND_SIGNALED;
473 fastreg_wr.wr.fast_reg.iova_start = desc->data_frpl->page_list[0] + offset; 473 fastreg_wr.wr.fast_reg.iova_start = desc->data_frpl->page_list[0] + offset;
474 fastreg_wr.wr.fast_reg.page_list = desc->data_frpl; 474 fastreg_wr.wr.fast_reg.page_list = desc->data_frpl;
475 fastreg_wr.wr.fast_reg.page_list_len = page_list_len; 475 fastreg_wr.wr.fast_reg.page_list_len = page_list_len;
@@ -480,20 +480,13 @@ static int iser_fast_reg_mr(struct fast_reg_descriptor *desc,
480 IB_ACCESS_REMOTE_WRITE | 480 IB_ACCESS_REMOTE_WRITE |
481 IB_ACCESS_REMOTE_READ); 481 IB_ACCESS_REMOTE_READ);
482 482
483 if (!wr) { 483 if (!wr)
484 wr = &fastreg_wr; 484 wr = &fastreg_wr;
485 atomic_inc(&ib_conn->post_send_buf_count); 485 else
486 } else {
487 wr->next = &fastreg_wr; 486 wr->next = &fastreg_wr;
488 atomic_add(2, &ib_conn->post_send_buf_count);
489 }
490 487
491 ret = ib_post_send(ib_conn->qp, wr, &bad_wr); 488 ret = ib_post_send(ib_conn->qp, wr, &bad_wr);
492 if (ret) { 489 if (ret) {
493 if (bad_wr->next)
494 atomic_sub(2, &ib_conn->post_send_buf_count);
495 else
496 atomic_dec(&ib_conn->post_send_buf_count);
497 iser_err("fast registration failed, ret:%d\n", ret); 490 iser_err("fast registration failed, ret:%d\n", ret);
498 return ret; 491 return ret;
499 } 492 }
diff --git a/drivers/infiniband/ulp/iser/iser_verbs.c b/drivers/infiniband/ulp/iser/iser_verbs.c
index ca37edef2791..7bdb811ad5b1 100644
--- a/drivers/infiniband/ulp/iser/iser_verbs.c
+++ b/drivers/infiniband/ulp/iser/iser_verbs.c
@@ -993,18 +993,16 @@ static int iser_drain_tx_cq(struct iser_device *device, int cq_index)
993 if (wc.status == IB_WC_SUCCESS) { 993 if (wc.status == IB_WC_SUCCESS) {
994 if (wc.opcode == IB_WC_SEND) 994 if (wc.opcode == IB_WC_SEND)
995 iser_snd_completion(tx_desc, ib_conn); 995 iser_snd_completion(tx_desc, ib_conn);
996 else if (wc.opcode == IB_WC_LOCAL_INV || 996 else
997 wc.opcode == IB_WC_FAST_REG_MR) {
998 atomic_dec(&ib_conn->post_send_buf_count);
999 continue;
1000 } else
1001 iser_err("expected opcode %d got %d\n", 997 iser_err("expected opcode %d got %d\n",
1002 IB_WC_SEND, wc.opcode); 998 IB_WC_SEND, wc.opcode);
1003 } else { 999 } else {
1004 iser_err("tx id %llx status %d vend_err %x\n", 1000 iser_err("tx id %llx status %d vend_err %x\n",
1005 wc.wr_id, wc.status, wc.vendor_err); 1001 wc.wr_id, wc.status, wc.vendor_err);
1006 atomic_dec(&ib_conn->post_send_buf_count); 1002 if (wc.wr_id != ISER_FRWR_LI_WRID) {
1007 iser_handle_comp_error(tx_desc, ib_conn); 1003 atomic_dec(&ib_conn->post_send_buf_count);
1004 iser_handle_comp_error(tx_desc, ib_conn);
1005 }
1008 } 1006 }
1009 completed_tx++; 1007 completed_tx++;
1010 } 1008 }