tcp: fix stretch ACK bugs in Scalable
authorPengcheng Yang <yangpc@wangsu.com>
Mon, 16 Mar 2020 06:35:08 +0000 (14:35 +0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 17 Mar 2020 01:26:54 +0000 (18:26 -0700)
Change Scalable to properly handle stretch ACKs in additive
increase mode by passing in the count of ACKed packets to
tcp_cong_avoid_ai().

In addition, because we are now precisely accounting for
stretch ACKs, including delayed ACKs, we can now change
TCP_SCALABLE_AI_CNT to 100.

Signed-off-by: Pengcheng Yang <yangpc@wangsu.com>
Acked-by: Neal Cardwell <ncardwell@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/tcp_scalable.c

index 471571e..6cebf41 100644 (file)
 #include <net/tcp.h>
 
 /* These factors derived from the recommended values in the aer:
- * .01 and and 7/8. We use 50 instead of 100 to account for
- * delayed ack.
+ * .01 and and 7/8.
  */
-#define TCP_SCALABLE_AI_CNT    50U
+#define TCP_SCALABLE_AI_CNT    100U
 #define TCP_SCALABLE_MD_SCALE  3
 
 static void tcp_scalable_cong_avoid(struct sock *sk, u32 ack, u32 acked)
@@ -23,11 +22,13 @@ static void tcp_scalable_cong_avoid(struct sock *sk, u32 ack, u32 acked)
        if (!tcp_is_cwnd_limited(sk))
                return;
 
-       if (tcp_in_slow_start(tp))
-               tcp_slow_start(tp, acked);
-       else
-               tcp_cong_avoid_ai(tp, min(tp->snd_cwnd, TCP_SCALABLE_AI_CNT),
-                                 1);
+       if (tcp_in_slow_start(tp)) {
+               acked = tcp_slow_start(tp, acked);
+               if (!acked)
+                       return;
+       }
+       tcp_cong_avoid_ai(tp, min(tp->snd_cwnd, TCP_SCALABLE_AI_CNT),
+                         acked);
 }
 
 static u32 tcp_scalable_ssthresh(struct sock *sk)