lkml.org 
[lkml]   [2019]   [Apr]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 141/168] tcp: tcp_grow_window() needs to respect tcp_space()
    Date
    From: Eric Dumazet <edumazet@google.com>

    [ Upstream commit 50ce163a72d817a99e8974222dcf2886d5deb1ae ]

    For some reason, tcp_grow_window() correctly tests if enough room
    is present before attempting to increase tp->rcv_ssthresh,
    but does not prevent it to grow past tcp_space()

    This is causing hard to debug issues, like failing
    the (__tcp_select_window(sk) >= tp->rcv_wnd) test
    in __tcp_ack_snd_check(), causing ACK delays and possibly
    slow flows.

    Depending on tcp_rmem[2], MTU, skb->len/skb->truesize ratio,
    we can see the problem happening on "netperf -t TCP_RR -- -r 2000,2000"
    after about 60 round trips, when the active side no longer sends
    immediate acks.

    This bug predates git history.

    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Acked-by: Soheil Hassas Yeganeh <soheil@google.com>
    Acked-by: Neal Cardwell <ncardwell@google.com>
    Acked-by: Wei Wang <weiwan@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 | 10 +++++-----
    1 file changed, 5 insertions(+), 5 deletions(-)

    --- a/net/ipv4/tcp_input.c
    +++ b/net/ipv4/tcp_input.c
    @@ -365,11 +365,12 @@ static int __tcp_grow_window(const struc
    static void tcp_grow_window(struct sock *sk, const struct sk_buff *skb)
    {
    struct tcp_sock *tp = tcp_sk(sk);
    + int room;
    +
    + room = min_t(int, tp->window_clamp, tcp_space(sk)) - tp->rcv_ssthresh;

    /* Check #1 */
    - if (tp->rcv_ssthresh < tp->window_clamp &&
    - (int)tp->rcv_ssthresh < tcp_space(sk) &&
    - !tcp_under_memory_pressure(sk)) {
    + if (room > 0 && !tcp_under_memory_pressure(sk)) {
    int incr;

    /* Check #2. Increase window, if skb with such overhead
    @@ -382,8 +383,7 @@ static void tcp_grow_window(struct sock

    if (incr) {
    incr = max_t(int, incr, 2 * skb->len);
    - tp->rcv_ssthresh = min(tp->rcv_ssthresh + incr,
    - tp->window_clamp);
    + tp->rcv_ssthresh += min(room, incr);
    inet_csk(sk)->icsk_ack.quick |= 1;
    }
    }

    \
     
     \ /
      Last update: 2019-04-24 19:23    [W:3.088 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site