• Willy Tarreau's avatar
    tcp: do_tcp_sendpages() must try to push data out on oom conditions · bad115cf
    Willy Tarreau authored
    Since recent changes on TCP splicing (starting with commits 2f533844
    "tcp: allow splice() to build full TSO packets" and 35f9c09f "tcp:
    tcp_sendpages() should call tcp_push() once"), I started seeing
    massive stalls when forwarding traffic between two sockets using
    splice() when pipe buffers were larger than socket buffers.
    
    Latest changes (net: netdev_alloc_skb() use build_skb()) made the
    problem even more apparent.
    
    The reason seems to be that if do_tcp_sendpages() fails on out of memory
    condition without being able to send at least one byte, tcp_push() is not
    called and the buffers cannot be flushed.
    
    After applying the attached patch, I cannot reproduce the stalls at all
    and the data rate it perfectly stable and steady under any condition
    which previously caused the problem to be permanent.
    
    The issue seems to have been there since before the kernel migrated to
    git, which makes me think that the stalls I occasionally experienced
    with tux during stress-tests years ago were probably related to the
    same issue.
    
    This issue was first encountered on 3.0.31 and 3.2.17, so please backport
    to -stable.
    Signed-off-by: default avatarWilly Tarreau <w@1wt.eu>
    Acked-by: default avatarEric Dumazet <edumazet@google.com>
    Cc: <stable@vger.kernel.org>
    bad115cf
tcp.c 86.5 KB