Re: [PATCH v2 15/21] xprtrdma: Disable completions for LOCAL_INV Work Requests

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux