lkml.org 
[lkml]   [2020]   [Jun]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 036/131] tcp_cubic: fix spurious HYSTART_DELAY exit upon drop in min RTT
    Date
    From: Neal Cardwell <ncardwell@google.com>

    [ Upstream commit b344579ca8478598937215f7005d6c7b84d28aee ]

    Mirja Kuehlewind reported a bug in Linux TCP CUBIC Hystart, where
    Hystart HYSTART_DELAY mechanism can exit Slow Start spuriously on an
    ACK when the minimum rtt of a connection goes down. From inspection it
    is clear from the existing code that this could happen in an example
    like the following:

    o The first 8 RTT samples in a round trip are 150ms, resulting in a
    curr_rtt of 150ms and a delay_min of 150ms.

    o The 9th RTT sample is 100ms. The curr_rtt does not change after the
    first 8 samples, so curr_rtt remains 150ms. But delay_min can be
    lowered at any time, so delay_min falls to 100ms. The code executes
    the HYSTART_DELAY comparison between curr_rtt of 150ms and delay_min
    of 100ms, and the curr_rtt is declared far enough above delay_min to
    force a (spurious) exit of Slow start.

    The fix here is simple: allow every RTT sample in a round trip to
    lower the curr_rtt.

    Fixes: ae27e98a5152 ("[TCP] CUBIC v2.3")
    Reported-by: Mirja Kuehlewind <mirja.kuehlewind@ericsson.com>
    Signed-off-by: Neal Cardwell <ncardwell@google.com>
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Acked-by: Soheil Hassas Yeganeh <soheil@google.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    net/ipv4/tcp_cubic.c | 2 ++
    1 file changed, 2 insertions(+)

    diff --git a/net/ipv4/tcp_cubic.c b/net/ipv4/tcp_cubic.c
    index 78bfadfcf3426..8b5ba0a5cd386 100644
    --- a/net/ipv4/tcp_cubic.c
    +++ b/net/ipv4/tcp_cubic.c
    @@ -403,6 +403,8 @@ static void hystart_update(struct sock *sk, u32 delay)

    if (hystart_detect & HYSTART_DELAY) {
    /* obtain the minimum delay of more than sampling packets */
    + if (ca->curr_rtt > delay)
    + ca->curr_rtt = delay;
    if (ca->sample_cnt < HYSTART_MIN_SAMPLES) {
    if (ca->curr_rtt == 0 || ca->curr_rtt > delay)
    ca->curr_rtt = delay;
    --
    2.25.1
    \
     
     \ /
      Last update: 2020-06-29 22:17    [W:4.026 / U:0.200 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site