| From foo@baz Thu Aug 24 17:49:47 PDT 2017 |
| From: Neal Cardwell <ncardwell@google.com> |
| Date: Wed, 16 Aug 2017 17:53:36 -0400 |
| Subject: tcp: when rearming RTO, if RTO time is in past then fire RTO ASAP |
| |
| From: Neal Cardwell <ncardwell@google.com> |
| |
| |
| [ 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: 6ba8a3b19e76 ("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> |
| --- |
| net/ipv4/tcp_input.c | 3 +-- |
| 1 file changed, 1 insertion(+), 2 deletions(-) |
| |
| --- a/net/ipv4/tcp_input.c |
| +++ b/net/ipv4/tcp_input.c |
| @@ -2985,8 +2985,7 @@ void tcp_rearm_rto(struct sock *sk) |
| /* delta may not be positive if the socket is locked |
| * when the retrans timer fires and is rescheduled. |
| */ |
| - if (delta > 0) |
| - rto = delta; |
| + rto = max(delta, 1); |
| } |
| inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS, rto, |
| TCP_RTO_MAX); |