| From d35a76067b44fade8b6b096eb39fd2240e45b6fe Mon Sep 17 00:00:00 2001 |
| From: Chuck Lever <chuck.lever@oracle.com> |
| Date: Mon, 19 Aug 2019 18:43:17 -0400 |
| Subject: [PATCH] xprtrdma: Toggle XPRT_CONGESTED in xprtrdma's slot methods |
| |
| commit 395790566eec37706dedeb94779045adc3a7581e upstream. |
| |
| Commit 48be539dd44a ("xprtrdma: Introduce ->alloc_slot call-out for |
| xprtrdma") added a separate alloc_slot and free_slot to the RPC/RDMA |
| transport. Later, commit 75891f502f5f ("SUNRPC: Support for |
| congestion control when queuing is enabled") modified the generic |
| alloc/free_slot methods, but neglected the methods in xprtrdma. |
| |
| Found via code review. |
| |
| Fixes: 75891f502f5f ("SUNRPC: Support for congestion control ... ") |
| Signed-off-by: Chuck Lever <chuck.lever@oracle.com> |
| Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/net/sunrpc/xprtrdma/transport.c b/net/sunrpc/xprtrdma/transport.c |
| index 1f73a6a7e43c..9abc4de76719 100644 |
| --- a/net/sunrpc/xprtrdma/transport.c |
| +++ b/net/sunrpc/xprtrdma/transport.c |
| @@ -537,6 +537,7 @@ xprt_rdma_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task) |
| return; |
| |
| out_sleep: |
| + set_bit(XPRT_CONGESTED, &xprt->state); |
| rpc_sleep_on(&xprt->backlog, task, NULL); |
| task->tk_status = -EAGAIN; |
| } |
| @@ -552,7 +553,8 @@ xprt_rdma_free_slot(struct rpc_xprt *xprt, struct rpc_rqst *rqst) |
| { |
| memset(rqst, 0, sizeof(*rqst)); |
| rpcrdma_buffer_put(rpcr_to_rdmar(rqst)); |
| - rpc_wake_up_next(&xprt->backlog); |
| + if (unlikely(!rpc_wake_up_next(&xprt->backlog))) |
| + clear_bit(XPRT_CONGESTED, &xprt->state); |
| } |
| |
| static bool rpcrdma_check_regbuf(struct rpcrdma_xprt *r_xprt, |
| -- |
| 2.7.4 |
| |