lkml.org 
[lkml]   [2020]   [Aug]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.7 75/79] tcp: apply a floor of 1 for RTT samples from TCP timestamps
    Date
    From: Jianfeng Wang <jfwang@google.com>

    [ Upstream commit 730e700e2c19d87e578ff0e7d8cb1d4a02b036d2 ]

    For retransmitted packets, TCP needs to resort to using TCP timestamps
    for computing RTT samples. In the common case where the data and ACK
    fall in the same 1-millisecond interval, TCP senders with millisecond-
    granularity TCP timestamps compute a ca_rtt_us of 0. This ca_rtt_us
    of 0 propagates to rs->rtt_us.

    This value of 0 can cause performance problems for congestion control
    modules. For example, in BBR, the zero min_rtt sample can bring the
    min_rtt and BDP estimate down to 0, reduce snd_cwnd and result in a
    low throughput. It would be hard to mitigate this with filtering in
    the congestion control module, because the proper floor to apply would
    depend on the method of RTT sampling (using timestamp options or
    internally-saved transmission timestamps).

    This fix applies a floor of 1 for the RTT sample delta from TCP
    timestamps, so that seq_rtt_us, ca_rtt_us, and rs->rtt_us will be at
    least 1 * (USEC_PER_SEC / TCP_TS_HZ).

    Note that the receiver RTT computation in tcp_rcv_rtt_measure() and
    min_rtt computation in tcp_update_rtt_min() both already apply a floor
    of 1 timestamp tick, so this commit makes the code more consistent in
    avoiding this edge case of a value of 0.

    Signed-off-by: Jianfeng Wang <jfwang@google.com>
    Signed-off-by: Neal Cardwell <ncardwell@google.com>
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Acked-by: Kevin Yang <yyd@google.com>
    Acked-by: Yuchung Cheng <ycheng@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 | 2 ++
    1 file changed, 2 insertions(+)

    --- a/net/ipv4/tcp_input.c
    +++ b/net/ipv4/tcp_input.c
    @@ -2945,6 +2945,8 @@ static bool tcp_ack_update_rtt(struct so
    u32 delta = tcp_time_stamp(tp) - tp->rx_opt.rcv_tsecr;

    if (likely(delta < INT_MAX / (USEC_PER_SEC / TCP_TS_HZ))) {
    + if (!delta)
    + delta = 1;
    seq_rtt_us = delta * (USEC_PER_SEC / TCP_TS_HZ);
    ca_rtt_us = seq_rtt_us;
    }

    \
     
     \ /
      Last update: 2020-08-10 17:26    [W:4.211 / U:0.400 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site