• Eric Dumazet's avatar
    tcp: fix SO_RCVLOWAT hangs with fat skbs · 24adbc16
    Eric Dumazet authored
    We autotune rcvbuf whenever SO_RCVLOWAT is set to account for 100%
    overhead in tcp_set_rcvlowat()
    
    This works well when skb->len/skb->truesize ratio is bigger than 0.5
    
    But if we receive packets with small MSS, we can end up in a situation
    where not enough bytes are available in the receive queue to satisfy
    RCVLOWAT setting.
    As our sk_rcvbuf limit is hit, we send zero windows in ACK packets,
    preventing remote peer from sending more data.
    
    Even autotuning does not help, because it only triggers at the time
    user process drains the queue. If no EPOLLIN is generated, this
    can not happen.
    
    Note poll() has a similar issue, after commit
    c7004482 ("tcp: Respect SO_RCVLOWAT in tcp_poll().")
    
    Fixes: 03f45c88 ("tcp: avoid extra wakeups for SO_RCVLOWAT users")
    Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
    Acked-by: default avatarSoheil Hassas Yeganeh <soheil@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    24adbc16
tcp.c 106 KB