aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorChuck Lever <chuck.lever@oracle.com>2014-07-29 17:25:20 -0400
committerAnna Schumaker <Anna.Schumaker@Netapp.com>2014-07-31 16:22:57 -0400
commitdab7e3b8da5ef76143a7e609612c306898f8f8fc (patch)
treedfea36e23ae5204f5d4e93c195ff740d9670cc6e /net
parent050557220e34ed5acc830c9bf6cd993f6b4ea33e (diff)
xprtrdma: Disable completions for LOCAL_INV Work Requests
Instead of relying on a completion to change the state of an FRMR to FRMR_IS_INVALID, set it in advance. If an error occurs, a completion will fire anyway and mark the FRMR FRMR_IS_STALE. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Tested-by: Steve Wise <swise@opengridcomputing.com> Tested-by: Shirley Ma <shirley.ma@oracle.com> Tested-by: Devesh Sharma <devesh.sharma@emulex.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
Diffstat (limited to 'net')
-rw-r--r--net/sunrpc/xprtrdma/verbs.c17
1 files changed, 8 insertions, 9 deletions
diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c
index 3e8b3881548d..08c92355c64c 100644
--- a/net/sunrpc/xprtrdma/verbs.c
+++ b/net/sunrpc/xprtrdma/verbs.c
@@ -154,12 +154,8 @@ rpcrdma_sendcq_process_wc(struct ib_wc *wc)
154 154
155 if (wc->wr_id == 0ULL) 155 if (wc->wr_id == 0ULL)
156 return; 156 return;
157 if (wc->status != IB_WC_SUCCESS) { 157 if (wc->status != IB_WC_SUCCESS)
158 frmr->r.frmr.fr_state = FRMR_IS_STALE; 158 frmr->r.frmr.fr_state = FRMR_IS_STALE;
159 return;
160 }
161
162 frmr->r.frmr.fr_state = FRMR_IS_INVALID;
163} 159}
164 160
165static int 161static int
@@ -1369,12 +1365,11 @@ rpcrdma_retry_local_inv(struct rpcrdma_mw *r, struct rpcrdma_ia *ia)
1369 dprintk("RPC: %s: FRMR %p is stale\n", __func__, r); 1365 dprintk("RPC: %s: FRMR %p is stale\n", __func__, r);
1370 1366
1371 /* When this FRMR is re-inserted into rb_mws, it is no longer stale */ 1367 /* When this FRMR is re-inserted into rb_mws, it is no longer stale */
1372 r->r.frmr.fr_state = FRMR_IS_VALID; 1368 r->r.frmr.fr_state = FRMR_IS_INVALID;
1373 1369
1374 memset(&invalidate_wr, 0, sizeof(invalidate_wr)); 1370 memset(&invalidate_wr, 0, sizeof(invalidate_wr));
1375 invalidate_wr.wr_id = (unsigned long)(void *)r; 1371 invalidate_wr.wr_id = (unsigned long)(void *)r;
1376 invalidate_wr.opcode = IB_WR_LOCAL_INV; 1372 invalidate_wr.opcode = IB_WR_LOCAL_INV;
1377 invalidate_wr.send_flags = IB_SEND_SIGNALED;
1378 invalidate_wr.ex.invalidate_rkey = r->r.frmr.fr_mr->rkey; 1373 invalidate_wr.ex.invalidate_rkey = r->r.frmr.fr_mr->rkey;
1379 DECR_CQCOUNT(&r_xprt->rx_ep); 1374 DECR_CQCOUNT(&r_xprt->rx_ep);
1380 1375
@@ -1778,10 +1773,11 @@ rpcrdma_deregister_frmr_external(struct rpcrdma_mr_seg *seg,
1778 struct ib_send_wr invalidate_wr, *bad_wr; 1773 struct ib_send_wr invalidate_wr, *bad_wr;
1779 int rc; 1774 int rc;
1780 1775
1776 seg1->mr_chunk.rl_mw->r.frmr.fr_state = FRMR_IS_INVALID;
1777
1781 memset(&invalidate_wr, 0, sizeof invalidate_wr); 1778 memset(&invalidate_wr, 0, sizeof invalidate_wr);
1782 invalidate_wr.wr_id = (unsigned long)(void *)seg1->mr_chunk.rl_mw; 1779 invalidate_wr.wr_id = (unsigned long)(void *)seg1->mr_chunk.rl_mw;
1783 invalidate_wr.opcode = IB_WR_LOCAL_INV; 1780 invalidate_wr.opcode = IB_WR_LOCAL_INV;
1784 invalidate_wr.send_flags = IB_SEND_SIGNALED;
1785 invalidate_wr.ex.invalidate_rkey = seg1->mr_chunk.rl_mw->r.frmr.fr_mr->rkey; 1781 invalidate_wr.ex.invalidate_rkey = seg1->mr_chunk.rl_mw->r.frmr.fr_mr->rkey;
1786 DECR_CQCOUNT(&r_xprt->rx_ep); 1782 DECR_CQCOUNT(&r_xprt->rx_ep);
1787 1783
@@ -1790,9 +1786,12 @@ rpcrdma_deregister_frmr_external(struct rpcrdma_mr_seg *seg,
1790 rpcrdma_unmap_one(ia, seg++); 1786 rpcrdma_unmap_one(ia, seg++);
1791 rc = ib_post_send(ia->ri_id->qp, &invalidate_wr, &bad_wr); 1787 rc = ib_post_send(ia->ri_id->qp, &invalidate_wr, &bad_wr);
1792 read_unlock(&ia->ri_qplock); 1788 read_unlock(&ia->ri_qplock);
1793 if (rc) 1789 if (rc) {
1790 /* Force rpcrdma_buffer_get() to retry */
1791 seg1->mr_chunk.rl_mw->r.frmr.fr_state = FRMR_IS_STALE;
1794 dprintk("RPC: %s: failed ib_post_send for invalidate," 1792 dprintk("RPC: %s: failed ib_post_send for invalidate,"
1795 " status %i\n", __func__, rc); 1793 " status %i\n", __func__, rc);
1794 }
1796 return rc; 1795 return rc;
1797} 1796}
1798 1797