Patch "tcp: when rearming RTO, if RTO time is in past then fire RTO ASAP" has been added to the 4.9-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
tcp: when rearming RTO, if RTO time is in past then fire RTO ASAP
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
tcp-when-rearming-rto-if-rto-time-is-in-past-then-fire-rto-asap.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Thu Aug 24 17:44:02 PDT 2017
From: Neal Cardwell <[email protected]>
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 <[email protected]>
[ 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.
--- net/ipv4/tcp_input.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
net/ipv4/tcp_input.c +1 -2
@@ -3036,8 +3036,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; + delta =max (delta,1 ); }inet_csk_reset_xmit_timer (sk,ICSK_TIME_RETRANS , rto,TCP_RTO_MAX );
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/tcp-when-rearming-rto-if-rto-time-is-in-past-then-fire-rto-asap.patch
Neal Cardwell
maintainernet/ipv4/tcp_input.c void tcp_rearm_rto(struct sock *sk) · line 3039
Quoted 12 lines · On Thu, Aug 24, 2017 at 8:45 PM, <[email protected]> wrote:
net/ipv4/tcp_input.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)net/ipv4/tcp_input.c +1
-2@@ -3036,8 +3036,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; + delta =max (delta,1 );
This probably should be:
rto = max(delta, 1);
I think the 4.12-stable backport looks good, but the 3.18, 4.4, and 4.9 backports have this issue.
Thanks,
neal
David Miller
maintainerFrom: Neal Cardwell <[email protected]>
Date: Thu, 24 Aug 2017 21:07:56 -0400
Quoted 16 lines · On Thu, Aug 24, 2017 at 8:45 PM, <[email protected]> wrote:
net/ipv4/tcp_input.c void tcp_rearm_rto(struct sock *sk) · line 3039
Quoted 12 lines
net/ipv4/tcp_input.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)net/ipv4/tcp_input.c +1
-2@@ -3036,8 +3036,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; + delta =max (delta,1 );This probably should be:
Quoted 4 lines
rto = max(delta, 1);I think the 4.12-stable backport looks good, but the 3.18, 4.4, and 4.9 backports have this issue.
My bad.
Greg could you please fix this up for me?
Thanks!
Greg KH
maintainerQuoted 19 lines · David Miller
From: Neal Cardwell <[email protected]>
Date: Thu, 24 Aug 2017 21:07:56 -0400Quoted 16 lines · On Thu, Aug 24, 2017 at 8:45 PM, <[email protected]> wrote:
net/ipv4/tcp_input.c void tcp_rearm_rto(struct sock *sk) · line 3039
Quoted 12 lines
net/ipv4/tcp_input.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)net/ipv4/tcp_input.c +1
-2@@ -3036,8 +3036,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; + delta =max (delta,1 );This probably should be:
Quoted 8 lines
Quoted 4 lines
rto = max(delta, 1);I think the 4.12-stable backport looks good, but the 3.18, 4.4, and 4.9 backports have this issue.
My bad.
Greg could you please fix this up for me?
Yes, will do. Neal, good catch.
greg k-h