diff options
Diffstat (limited to 'net/sunrpc/xprtrdma/rpc_rdma.c')
-rw-r--r-- | net/sunrpc/xprtrdma/rpc_rdma.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/net/sunrpc/xprtrdma/rpc_rdma.c b/net/sunrpc/xprtrdma/rpc_rdma.c index ac65b0cb66b2..77b84cfa5c77 100644 --- a/net/sunrpc/xprtrdma/rpc_rdma.c +++ b/net/sunrpc/xprtrdma/rpc_rdma.c | |||
@@ -716,6 +716,7 @@ rpcrdma_reply_handler(struct rpcrdma_rep *rep) | |||
716 | struct rpcrdma_xprt *r_xprt = rpcx_to_rdmax(xprt); | 716 | struct rpcrdma_xprt *r_xprt = rpcx_to_rdmax(xprt); |
717 | __be32 *iptr; | 717 | __be32 *iptr; |
718 | int rdmalen, status; | 718 | int rdmalen, status; |
719 | unsigned long cwnd; | ||
719 | 720 | ||
720 | /* Check status. If bad, signal disconnect and return rep to pool */ | 721 | /* Check status. If bad, signal disconnect and return rep to pool */ |
721 | if (rep->rr_len == ~0U) { | 722 | if (rep->rr_len == ~0U) { |
@@ -845,6 +846,11 @@ badheader: | |||
845 | break; | 846 | break; |
846 | } | 847 | } |
847 | 848 | ||
849 | cwnd = xprt->cwnd; | ||
850 | xprt->cwnd = atomic_read(&r_xprt->rx_buf.rb_credits) << RPC_CWNDSHIFT; | ||
851 | if (xprt->cwnd > cwnd) | ||
852 | xprt_release_rqst_cong(rqst->rq_task); | ||
853 | |||
848 | dprintk("RPC: %s: xprt_complete_rqst(0x%p, 0x%p, %d)\n", | 854 | dprintk("RPC: %s: xprt_complete_rqst(0x%p, 0x%p, %d)\n", |
849 | __func__, xprt, rqst, status); | 855 | __func__, xprt, rqst, status); |
850 | xprt_complete_rqst(rqst->rq_task, status); | 856 | xprt_complete_rqst(rqst->rq_task, status); |