That would significantly reduce the interrupts rate. I will run some performance test. Would these unsignaled SENDs be possible to stall? Shirley On 07/09/2014 09:58 AM, Chuck Lever wrote: > 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@xxxxxxxxxx> > --- > net/sunrpc/xprtrdma/verbs.c | 17 ++++++++--------- > 1 file changed, 8 insertions(+), 9 deletions(-) > > diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c > index e83eda6..8eef343 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) > > 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); > > @@ -1787,10 +1782,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); > > @@ -1799,9 +1795,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; > } > > > -- > To unsubscribe from this list: send the line "unsubscribe linux-rdma" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html