Skip to content

Commit 4e39b74

Browse files
nealcardwellgregkh
authored andcommitted
tcp: when rearming RTO, if RTO time is in past then fire RTO ASAP
[ Upstream commit cdbeb633ca71a02b7b63bfeb94994bf4e1a0b894 ] In some situations tcp_send_loss_probe() can realize that it's unable to send a loss probe (TLP), and falls back to calling tcp_rearm_rto() to schedule an RTO timer. In such cases, sometimes tcp_rearm_rto() realizes that the RTO was eligible to fire immediately or at some point in the past (delta_us <= 0). Previously in such cases tcp_rearm_rto() was scheduling such "overdue" RTOs to happen at now + icsk_rto, which caused needless delays of hundreds of milliseconds (and non-linear behavior that made reproducible testing difficult). This commit changes the logic to schedule "overdue" RTOs ASAP, rather than at now + icsk_rto. Fixes: 6ba8a3b ("tcp: Tail loss probe (TLP)") Suggested-by: Yuchung Cheng <ycheng@google.com> Signed-off-by: Neal Cardwell <ncardwell@google.com> Signed-off-by: Yuchung Cheng <ycheng@google.com> Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent ece3ff1 commit 4e39b74

1 file changed

Lines changed: 1 addition & 2 deletions

File tree

net/ipv4/tcp_input.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3028,8 +3028,7 @@ void tcp_rearm_rto(struct sock *sk)
30283028
/* delta may not be positive if the socket is locked
30293029
* when the retrans timer fires and is rescheduled.
30303030
*/
3031-
if (delta > 0)
3032-
rto = delta;
3031+
rto = max(delta, 1);
30333032
}
30343033
inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS, rto,
30353034
TCP_RTO_MAX);

0 commit comments

Comments
 (0)