diff options
author | Chuck Lever <chuck.lever@oracle.com> | 2014-07-29 17:25:20 -0400 |
---|---|---|
committer | Anna Schumaker <Anna.Schumaker@Netapp.com> | 2014-07-31 16:22:57 -0400 |
commit | dab7e3b8da5ef76143a7e609612c306898f8f8fc (patch) | |
tree | dfea36e23ae5204f5d4e93c195ff740d9670cc6e /net | |
parent | 050557220e34ed5acc830c9bf6cd993f6b4ea33e (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.c | 17 |
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 | ||
165 | static int | 161 | static 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 | ||