From 2afed824a4df1bef1aba1b3e76c2c95c2f9400dd Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Fri, 4 Aug 2023 07:21:40 +0000 Subject: [PATCH] Revert "tcp: Fix data-races around sysctl_tcp_syn(ack)?_retries." This reverts commit 7b0084918c5f7da21dbb91ec24da7a554edd3209 which is commit 20a3b1c0f603e8c55c3396abd12dfcfb523e4d3c upstream. It breaks the Android abi. If it is required in the future, it can come back in an abi-safe way. Bug: 161946584 Change-Id: Id6fdb41a7797ed851cc37b4fe141fc69a069b640 Signed-off-by: Greg Kroah-Hartman --- net/ipv4/inet_connection_sock.c | 3 +-- net/ipv4/tcp.c | 3 +-- net/ipv4/tcp_timer.c | 10 +++------- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c index e6dcbe971398..4fbc23e1e640 100644 --- a/net/ipv4/inet_connection_sock.c +++ b/net/ipv4/inet_connection_sock.c @@ -740,8 +740,7 @@ static void reqsk_timer_handler(struct timer_list *t) if (inet_sk_state_load(sk_listener) != TCP_LISTEN) goto drop; - max_syn_ack_retries = icsk->icsk_syn_retries ? : - READ_ONCE(net->ipv4.sysctl_tcp_synack_retries); + max_syn_ack_retries = icsk->icsk_syn_retries ? : net->ipv4.sysctl_tcp_synack_retries; /* Normally all the openreqs are young and become mature * (i.e. converted to established socket) for first timeout. * If synack was not acknowledged for 1 second, it means diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index c2e1ab8fd1f5..c430e2511513 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -3716,8 +3716,7 @@ static int do_tcp_getsockopt(struct sock *sk, int level, val = keepalive_probes(tp); break; case TCP_SYNCNT: - val = icsk->icsk_syn_retries ? : - READ_ONCE(net->ipv4.sysctl_tcp_syn_retries); + val = icsk->icsk_syn_retries ? : net->ipv4.sysctl_tcp_syn_retries; break; case TCP_LINGER2: val = READ_ONCE(tp->linger2); diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c index 715fdfa3e2ae..888683f2ff3e 100644 --- a/net/ipv4/tcp_timer.c +++ b/net/ipv4/tcp_timer.c @@ -239,8 +239,7 @@ static int tcp_write_timeout(struct sock *sk) if ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) { if (icsk->icsk_retransmits) __dst_negative_advice(sk); - retry_until = icsk->icsk_syn_retries ? : - READ_ONCE(net->ipv4.sysctl_tcp_syn_retries); + retry_until = icsk->icsk_syn_retries ? : net->ipv4.sysctl_tcp_syn_retries; expired = icsk->icsk_retransmits >= retry_until; } else { if (retransmits_timed_out(sk, READ_ONCE(net->ipv4.sysctl_tcp_retries1), 0)) { @@ -407,15 +406,12 @@ abort: tcp_write_err(sk); static void tcp_fastopen_synack_timer(struct sock *sk, struct request_sock *req) { struct inet_connection_sock *icsk = inet_csk(sk); + int max_retries = icsk->icsk_syn_retries ? : + sock_net(sk)->ipv4.sysctl_tcp_synack_retries + 1; /* add one more retry for fastopen */ struct tcp_sock *tp = tcp_sk(sk); - int max_retries; req->rsk_ops->syn_ack_timeout(req); - /* add one more retry for fastopen */ - max_retries = icsk->icsk_syn_retries ? : - READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_synack_retries) + 1; - if (req->num_timeout >= max_retries) { tcp_write_err(sk); return;