diff options
| author | Gerd Rausch <gerd.rausch@oracle.com> | 2026-02-02 22:57:19 -0700 |
|---|---|---|
| committer | Jakub Kicinski <kuba@kernel.org> | 2026-02-04 20:46:38 -0800 |
| commit | aa0cd656f03209733d941f0d27b4e68db4443a07 (patch) | |
| tree | 6c3be5005dd3dc3f7924b726615b3a78f2805785 | |
| parent | 826c1004d4aea60ee3f97de9eb25f8c489965c97 (diff) | |
net/rds: Kick-start TCP receiver after accept
In cases where the server (the node with the higher IP-address)
in an RDS/TCP connection is overwhelmed it is possible that the
socket that was just accepted is chock-full of messages, up to
the limit of what the socket receive buffer permits.
Subsequently, "rds_tcp_data_ready" won't be called anymore,
because there is no more space to receive additional messages.
Nor was it called prior to the point of calling "rds_tcp_set_callbacks",
because the "sk_data_ready" pointer didn't even point to
"rds_tcp_data_ready" yet.
We fix this by simply kick-starting the receive-worker
for all cases where the socket state is neither
"TCP_CLOSE_WAIT" nor "TCP_CLOSE".
Signed-off-by: Gerd Rausch <gerd.rausch@oracle.com>
Signed-off-by: Allison Henderson <allison.henderson@oracle.com>
Link: https://patch.msgid.link/20260203055723.1085751-5-achender@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
| -rw-r--r-- | net/rds/tcp_listen.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/net/rds/tcp_listen.c b/net/rds/tcp_listen.c index 492dcc6568bf..b5786227623c 100644 --- a/net/rds/tcp_listen.c +++ b/net/rds/tcp_listen.c @@ -291,6 +291,8 @@ int rds_tcp_accept_one(struct rds_tcp_net *rtn) new_sock->sk->sk_state == TCP_LAST_ACK || new_sock->sk->sk_state == TCP_CLOSE) rds_conn_path_drop(cp, 0); + else + queue_delayed_work(cp->cp_wq, &cp->cp_recv_w, 0); new_sock = NULL; ret = 0; |
