• Eric Dumazet's avatar
    tcp: fix SO_RCVLOWAT related hangs under mem pressure · f969dc5a
    Eric Dumazet authored
    While commit 24adbc16 ("tcp: fix SO_RCVLOWAT hangs with fat skbs")
    fixed an issue vs too small sk_rcvbuf for given sk_rcvlowat constraint,
    it missed to address issue caused by memory pressure.
    
    1) If we are under memory pressure and socket receive queue is empty.
    First incoming packet is allowed to be queued, after commit
    76dfa608 ("tcp: allow one skb to be received per socket under memory pressure")
    
    But we do not send EPOLLIN yet, in case tcp_data_ready() sees sk_rcvlowat
    is bigger than skb length.
    
    2) Then, when next packet comes, it is dropped, and we directly
    call sk->sk_data_ready().
    
    3) If application is using poll(), tcp_poll() will then use
    tcp_stream_is_readable() and decide the socket receive queue is
    not yet filled, so nothing will happen.
    
    Even when sender retransmits packets, phases 2) & 3) repeat
    and flow is effectively frozen, until memory pressure is off.
    
    Fix is to consider tcp_under_memory_pressure() to take care
    of global memory pressure or memcg pressure.
    
    Fixes: 24adbc16 ("tcp: fix SO_RCVLOWAT hangs with fat skbs")
    Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
    Reported-by: default avatarArjun Roy <arjunroy@google.com>
    Suggested-by: default avatarWei Wang <weiwan@google.com>
    Reviewed-by: default avatarWei Wang <weiwan@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    f969dc5a
tcp.h 71.9 KB