diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/sunrpc/xprtrdma/svc_rdma_recvfrom.c | 10 | ||||
| -rw-r--r-- | net/sunrpc/xprtrdma/svc_rdma_transport.c | 5 | 
2 files changed, 12 insertions, 3 deletions
| diff --git a/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c b/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c index 1e7381ff948b..2571188ef7f2 100644 --- a/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c +++ b/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c @@ -285,6 +285,7 @@ static bool svc_rdma_refresh_recvs(struct svcxprt_rdma *rdma,  		ctxt->rc_temp = temp;  		ctxt->rc_recv_wr.next = recv_chain;  		recv_chain = &ctxt->rc_recv_wr; +		rdma->sc_pending_recvs++;  	}  	if (!recv_chain)  		return false; @@ -302,6 +303,8 @@ err_free:  		bad_wr = bad_wr->next;  		svc_rdma_recv_ctxt_put(rdma, ctxt);  	} +	/* Since we're destroying the xprt, no need to reset +	 * sc_pending_recvs. */  	return false;  } @@ -328,6 +331,8 @@ static void svc_rdma_wc_receive(struct ib_cq *cq, struct ib_wc *wc)  	struct ib_cqe *cqe = wc->wr_cqe;  	struct svc_rdma_recv_ctxt *ctxt; +	rdma->sc_pending_recvs--; +  	/* WARNING: Only wc->wr_cqe and wc->status are reliable */  	ctxt = container_of(cqe, struct svc_rdma_recv_ctxt, rc_cqe); @@ -344,8 +349,9 @@ static void svc_rdma_wc_receive(struct ib_cq *cq, struct ib_wc *wc)  	 * to reduce the likelihood of replayed requests once the  	 * client reconnects.  	 */ -	if (!svc_rdma_refresh_recvs(rdma, 1, false)) -		goto flushed; +	if (rdma->sc_pending_recvs < rdma->sc_max_requests) +		if (!svc_rdma_refresh_recvs(rdma, rdma->sc_recv_batch, false)) +			goto flushed;  	/* All wc fields are now known to be valid */  	ctxt->rc_byte_len = wc->byte_len; diff --git a/net/sunrpc/xprtrdma/svc_rdma_transport.c b/net/sunrpc/xprtrdma/svc_rdma_transport.c index 046a07da5cf9..e629eacfedfc 100644 --- a/net/sunrpc/xprtrdma/svc_rdma_transport.c +++ b/net/sunrpc/xprtrdma/svc_rdma_transport.c @@ -407,11 +407,14 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt)  	newxprt->sc_max_req_size = svcrdma_max_req_size;  	newxprt->sc_max_requests = svcrdma_max_requests;  	newxprt->sc_max_bc_requests = svcrdma_max_bc_requests; -	rq_depth = newxprt->sc_max_requests + newxprt->sc_max_bc_requests; +	newxprt->sc_recv_batch = RPCRDMA_MAX_RECV_BATCH; +	rq_depth = newxprt->sc_max_requests + newxprt->sc_max_bc_requests + +		   newxprt->sc_recv_batch;  	if (rq_depth > dev->attrs.max_qp_wr) {  		pr_warn("svcrdma: reducing receive depth to %d\n",  			dev->attrs.max_qp_wr);  		rq_depth = dev->attrs.max_qp_wr; +		newxprt->sc_recv_batch = 1;  		newxprt->sc_max_requests = rq_depth - 2;  		newxprt->sc_max_bc_requests = 2;  	} | 
