|
@@ -1510,7 +1510,7 @@ rpcrdma_buffer_put_sendbuf(struct rpcrdma_req *req, struct rpcrdma_buffer *buf)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/* rpcrdma_unmap_one() was already done by rpcrdma_deregister_frmr_external().
|
|
|
+/* rpcrdma_unmap_one() was already done during deregistration.
|
|
|
* Redo only the ib_post_send().
|
|
|
*/
|
|
|
static void
|
|
@@ -1890,85 +1890,6 @@ rpcrdma_unmap_one(struct rpcrdma_ia *ia, struct rpcrdma_mr_seg *seg)
|
|
|
seg->mr_dma, seg->mr_dmalen, seg->mr_dir);
|
|
|
}
|
|
|
|
|
|
-static int
|
|
|
-rpcrdma_deregister_frmr_external(struct rpcrdma_mr_seg *seg,
|
|
|
- struct rpcrdma_ia *ia, struct rpcrdma_xprt *r_xprt)
|
|
|
-{
|
|
|
- struct rpcrdma_mr_seg *seg1 = seg;
|
|
|
- struct ib_send_wr invalidate_wr, *bad_wr;
|
|
|
- int rc;
|
|
|
-
|
|
|
- seg1->rl_mw->r.frmr.fr_state = FRMR_IS_INVALID;
|
|
|
-
|
|
|
- memset(&invalidate_wr, 0, sizeof invalidate_wr);
|
|
|
- invalidate_wr.wr_id = (unsigned long)(void *)seg1->rl_mw;
|
|
|
- invalidate_wr.opcode = IB_WR_LOCAL_INV;
|
|
|
- invalidate_wr.ex.invalidate_rkey = seg1->rl_mw->r.frmr.fr_mr->rkey;
|
|
|
- DECR_CQCOUNT(&r_xprt->rx_ep);
|
|
|
-
|
|
|
- read_lock(&ia->ri_qplock);
|
|
|
- while (seg1->mr_nsegs--)
|
|
|
- rpcrdma_unmap_one(ia, seg++);
|
|
|
- rc = ib_post_send(ia->ri_id->qp, &invalidate_wr, &bad_wr);
|
|
|
- read_unlock(&ia->ri_qplock);
|
|
|
- if (rc) {
|
|
|
- /* Force rpcrdma_buffer_get() to retry */
|
|
|
- seg1->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;
|
|
|
-}
|
|
|
-
|
|
|
-static int
|
|
|
-rpcrdma_deregister_fmr_external(struct rpcrdma_mr_seg *seg,
|
|
|
- struct rpcrdma_ia *ia)
|
|
|
-{
|
|
|
- struct rpcrdma_mr_seg *seg1 = seg;
|
|
|
- LIST_HEAD(l);
|
|
|
- int rc;
|
|
|
-
|
|
|
- list_add(&seg1->rl_mw->r.fmr->list, &l);
|
|
|
- rc = ib_unmap_fmr(&l);
|
|
|
- read_lock(&ia->ri_qplock);
|
|
|
- while (seg1->mr_nsegs--)
|
|
|
- rpcrdma_unmap_one(ia, seg++);
|
|
|
- read_unlock(&ia->ri_qplock);
|
|
|
- if (rc)
|
|
|
- dprintk("RPC: %s: failed ib_unmap_fmr,"
|
|
|
- " status %i\n", __func__, rc);
|
|
|
- return rc;
|
|
|
-}
|
|
|
-
|
|
|
-int
|
|
|
-rpcrdma_deregister_external(struct rpcrdma_mr_seg *seg,
|
|
|
- struct rpcrdma_xprt *r_xprt)
|
|
|
-{
|
|
|
- struct rpcrdma_ia *ia = &r_xprt->rx_ia;
|
|
|
- int nsegs = seg->mr_nsegs, rc;
|
|
|
-
|
|
|
- switch (ia->ri_memreg_strategy) {
|
|
|
-
|
|
|
- case RPCRDMA_ALLPHYSICAL:
|
|
|
- read_lock(&ia->ri_qplock);
|
|
|
- rpcrdma_unmap_one(ia, seg);
|
|
|
- read_unlock(&ia->ri_qplock);
|
|
|
- break;
|
|
|
-
|
|
|
- case RPCRDMA_FRMR:
|
|
|
- rc = rpcrdma_deregister_frmr_external(seg, ia, r_xprt);
|
|
|
- break;
|
|
|
-
|
|
|
- case RPCRDMA_MTHCAFMR:
|
|
|
- rc = rpcrdma_deregister_fmr_external(seg, ia);
|
|
|
- break;
|
|
|
-
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
- return nsegs;
|
|
|
-}
|
|
|
-
|
|
|
/*
|
|
|
* Prepost any receive buffer, then post send.
|
|
|
*
|