|
@@ -154,12 +154,8 @@ rpcrdma_sendcq_process_wc(struct ib_wc *wc)
|
|
|
|
|
|
if (wc->wr_id == 0ULL)
|
|
|
return;
|
|
|
- if (wc->status != IB_WC_SUCCESS) {
|
|
|
+ if (wc->status != IB_WC_SUCCESS)
|
|
|
frmr->r.frmr.fr_state = FRMR_IS_STALE;
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- frmr->r.frmr.fr_state = FRMR_IS_INVALID;
|
|
|
}
|
|
|
|
|
|
static int
|
|
@@ -1369,12 +1365,11 @@ rpcrdma_retry_local_inv(struct rpcrdma_mw *r, struct rpcrdma_ia *ia)
|
|
|
dprintk("RPC: %s: FRMR %p is stale\n", __func__, r);
|
|
|
|
|
|
/* When this FRMR is re-inserted into rb_mws, it is no longer stale */
|
|
|
- r->r.frmr.fr_state = FRMR_IS_VALID;
|
|
|
+ r->r.frmr.fr_state = FRMR_IS_INVALID;
|
|
|
|
|
|
memset(&invalidate_wr, 0, sizeof(invalidate_wr));
|
|
|
invalidate_wr.wr_id = (unsigned long)(void *)r;
|
|
|
invalidate_wr.opcode = IB_WR_LOCAL_INV;
|
|
|
- invalidate_wr.send_flags = IB_SEND_SIGNALED;
|
|
|
invalidate_wr.ex.invalidate_rkey = r->r.frmr.fr_mr->rkey;
|
|
|
DECR_CQCOUNT(&r_xprt->rx_ep);
|
|
|
|
|
@@ -1778,10 +1773,11 @@ rpcrdma_deregister_frmr_external(struct rpcrdma_mr_seg *seg,
|
|
|
struct ib_send_wr invalidate_wr, *bad_wr;
|
|
|
int rc;
|
|
|
|
|
|
+ seg1->mr_chunk.rl_mw->r.frmr.fr_state = FRMR_IS_INVALID;
|
|
|
+
|
|
|
memset(&invalidate_wr, 0, sizeof invalidate_wr);
|
|
|
invalidate_wr.wr_id = (unsigned long)(void *)seg1->mr_chunk.rl_mw;
|
|
|
invalidate_wr.opcode = IB_WR_LOCAL_INV;
|
|
|
- invalidate_wr.send_flags = IB_SEND_SIGNALED;
|
|
|
invalidate_wr.ex.invalidate_rkey = seg1->mr_chunk.rl_mw->r.frmr.fr_mr->rkey;
|
|
|
DECR_CQCOUNT(&r_xprt->rx_ep);
|
|
|
|
|
@@ -1790,9 +1786,12 @@ rpcrdma_deregister_frmr_external(struct rpcrdma_mr_seg *seg,
|
|
|
rpcrdma_unmap_one(ia, seg++);
|
|
|
rc = ib_post_send(ia->ri_id->qp, &invalidate_wr, &bad_wr);
|
|
|
read_unlock(&ia->ri_qplock);
|
|
|
- if (rc)
|
|
|
+ if (rc) {
|
|
|
+ /* Force rpcrdma_buffer_get() to retry */
|
|
|
+ seg1->mr_chunk.rl_mw->r.frmr.fr_state = FRMR_IS_STALE;
|
|
|
dprintk("RPC: %s: failed ib_post_send for invalidate,"
|
|
|
" status %i\n", __func__, rc);
|
|
|
+ }
|
|
|
return rc;
|
|
|
}
|
|
|
|