Message ID | 20221021170821.1093930-1-ncardwell.kernel@gmail.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 3d2af9cce3133b3bc596a9d065c6f9d93419ccfb |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net] tcp: fix indefinite deferral of RTO with SACK reneging | expand |
Hello: This patch was applied to netdev/net.git (master) by Jakub Kicinski <kuba@kernel.org>: On Fri, 21 Oct 2022 17:08:21 +0000 you wrote: > From: Neal Cardwell <ncardwell@google.com> > > This commit fixes a bug that can cause a TCP data sender to repeatedly > defer RTOs when encountering SACK reneging. > > The bug is that when we're in fast recovery in a scenario with SACK > reneging, every time we get an ACK we call tcp_check_sack_reneging() > and it can note the apparent SACK reneging and rearm the RTO timer for > srtt/2 into the future. In some SACK reneging scenarios that can > happen repeatedly until the receive window fills up, at which point > the sender can't send any more, the ACKs stop arriving, and the RTO > fires at srtt/2 after the last ACK. But that can take far too long > (O(10 secs)), since the connection is stuck in fast recovery with a > low cwnd that cannot grow beyond ssthresh, even if more bandwidth is > available. > > [...] Here is the summary with links: - [net] tcp: fix indefinite deferral of RTO with SACK reneging https://git.kernel.org/netdev/net/c/3d2af9cce313 You are awesome, thank you!
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index bc2ea12221f95..0640453fce54b 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -2192,7 +2192,8 @@ void tcp_enter_loss(struct sock *sk) */ static bool tcp_check_sack_reneging(struct sock *sk, int flag) { - if (flag & FLAG_SACK_RENEGING) { + if (flag & FLAG_SACK_RENEGING && + flag & FLAG_SND_UNA_ADVANCED) { struct tcp_sock *tp = tcp_sk(sk); unsigned long delay = max(usecs_to_jiffies(tp->srtt_us >> 4), msecs_to_jiffies(10));