lkml.org 
[lkml]   [2013]   [Mar]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 05/86] tcp: fix MSG_SENDPAGE_NOTLAST logic
    3.6.11.1 stable review patch.
    If anyone has any objections, please let me know.

    ------------------

    From: Eric Dumazet <edumazet@google.com>

    [ Upstream commit ae62ca7b03217be5e74759dc6d7698c95df498b3 ]

    commit 35f9c09fe9c72e (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: Willy Tarreau <w@1wt.eu>
    Bisected-by: Willy Tarreau <w@1wt.eu>
    Tested-by: Willy Tarreau <w@1wt.eu>
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    ---
    fs/splice.c | 4 +++-
    1 file changed, 3 insertions(+), 1 deletion(-)

    diff --git a/fs/splice.c b/fs/splice.c
    index 41514dd..c69fbb7 100644
    --- a/fs/splice.c
    +++ b/fs/splice.c
    @@ -696,8 +696,10 @@ static int pipe_to_sendpage(struct pipe_inode_info *pipe,
    return -EINVAL;

    more = (sd->flags & SPLICE_F_MORE) ? MSG_MORE : 0;
    - if (sd->len < sd->total_len)
    +
    + if (sd->len < sd->total_len && pipe->nrbufs > 1)
    more |= MSG_SENDPAGE_NOTLAST;
    +
    return file->f_op->sendpage(file, buf->page, buf->offset,
    sd->len, &pos, more);
    }
    --
    1.7.10.4



    \
     
     \ /
      Last update: 2013-03-26 19:21    [W:6.130 / U:0.616 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site