summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGerd Rausch <gerd.rausch@oracle.com>2026-02-02 22:57:19 -0700
committerJakub Kicinski <kuba@kernel.org>2026-02-04 20:46:38 -0800
commitaa0cd656f03209733d941f0d27b4e68db4443a07 (patch)
tree6c3be5005dd3dc3f7924b726615b3a78f2805785
parent826c1004d4aea60ee3f97de9eb25f8c489965c97 (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.c2
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;