SUNRPC: Fix congestion window race with disconnect
diff mbox series

Message ID
State New
Headers show
  • SUNRPC: Fix congestion window race with disconnect
Related show

Commit Message

Chuck Lever Sept. 13, 2019, 8:01 p.m. UTC
If the congestion window closes just as the transport disconnects,
a reconnect is never driven because:

1. The XPRT_CONG_WAIT flag prevents tasks from taking the write lock
2. There's no wake-up of the first task on the xprt->sending queue

To address this, clear the congestion wait flag as part of
completing a disconnect.

Fixes: 75891f502f5f ("SUNRPC: Support for congestion control ... ")
Signed-off-by: Chuck Lever <>
 net/sunrpc/xprt.c |    7 +++++++
 1 file changed, 7 insertions(+)

Hi Anna, Trond -

Please consider including this fix in next week's merge window.

diff mbox series

diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c
index 2e71f54..0f94a3c 100644
--- a/net/sunrpc/xprt.c
+++ b/net/sunrpc/xprt.c
@@ -456,6 +456,12 @@  void xprt_release_rqst_cong(struct rpc_task *task)
+static void xprt_clear_congestion_window_wait_locked(struct rpc_xprt *xprt)
+	if (test_and_clear_bit(XPRT_CWND_WAIT, &xprt->state))
+		__xprt_lock_write_next_cong(xprt);
  * Clear the congestion window wait flag and wake up the next
  * entry on xprt->sending
@@ -671,6 +677,7 @@  void xprt_disconnect_done(struct rpc_xprt *xprt)
+	xprt_clear_congestion_window_wait_locked(xprt);
 	xprt_wake_pending_tasks(xprt, -ENOTCONN);