• Eric Dumazet's avatar
    tcp: fix MSG_SENDPAGE_NOTLAST logic · ae62ca7b
    Eric Dumazet authored
    commit 35f9c09f (tcp: tcp_sendpages() should call tcp_push() once)
    added an internal flag : MSG_SENDPAGE_NOTLAST meant to be set on all
    frags but the last one for a splice() call.
    
    The condition used to set the flag in pipe_to_sendpage() relied on
    splice() user passing the exact number of bytes present in the pipe,
    or a smaller one.
    
    But some programs pass an arbitrary high value, and the test fails.
    
    The effect of this bug is a lack of tcp_push() at the end of a
    splice(pipe -> socket) call, and possibly very slow or erratic TCP
    sessions.
    
    We should both test sd->total_len and fact that another fragment
    is in the pipe (pipe->nrbufs > 1)
    
    Many thanks to Willy for providing very clear bug report, bisection
    and test programs.
    Reported-by: default avatarWilly Tarreau <w@1wt.eu>
    Bisected-by: default avatarWilly Tarreau <w@1wt.eu>
    Tested-by: default avatarWilly Tarreau <w@1wt.eu>
    Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    ae62ca7b
splice.c 46.3 KB