Skip to contentSkip to conversation

Patch "tcp: when rearming RTO, if RTO time is in past then fire RTO ASAP" has been added to the 4.9-stable tree

PATCH [email protected] 3 participants 4 messages Aug 25, 2017

Subsystems (3)
lore
Share & tools
lore

[email protected]

author maintainer Applied
#0 lore raw

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

maintainer
#1 lore raw

net/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

maintainer
#2 lore raw

From: 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!

author maintainer
#3 lore raw
Quoted 19 lines · David Miller

From: 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 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