lkml.org 
[lkml]   [2009]   [Jan]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH] tcp: splice as many packets as possible at once
    Eric Dumazet a écrit :
    > David Miller a écrit :
    >> I'm not applying this until someone explains to me why
    >> we should remove this test from the splice receive but
    >> keep it in the tcp_recvmsg() code where it has been
    >> essentially forever.

    Reading again tcp_recvmsg(), I found it already is able to eat several skb
    even in nonblocking mode.

    setsockopt(5, SOL_SOCKET, SO_RCVLOWAT, [61440], 4) = 0
    ioctl(5, FIONBIO, [1]) = 0
    poll([{fd=5, events=POLLIN, revents=POLLIN}], 1, -1) = 1
    recv(5, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536, MSG_DONTWAIT) = 65536
    write(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
    poll([{fd=5, events=POLLIN, revents=POLLIN}], 1, -1) = 1
    recv(5, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536, MSG_DONTWAIT) = 65536
    write(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
    poll([{fd=5, events=POLLIN, revents=POLLIN}], 1, -1) = 1
    recv(5, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536, MSG_DONTWAIT) = 65536
    write(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
    poll([{fd=5, events=POLLIN, revents=POLLIN}], 1, -1) = 1
    recv(5, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536, MSG_DONTWAIT) = 65536
    write(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536


    David, if you referred to code at line 1374 of net/ipv4/tcp.c, I believe there is
    no issue with it. We really want to break from this loop if !timeo .

    Willy patch makes splice() behaving like tcp_recvmsg(), but we might call
    tcp_cleanup_rbuf() several times, with copied=1460 (for each frame processed)

    I wonder if the right fix should be done in tcp_read_sock() : this is the
    one who should eat several skbs IMHO, if we want optimal ACK generation.

    We break out of its loop at line 1246

    if (!desc->count) /* this test is always true */
    break;

    (__tcp_splice_read() set count to 0, right before calling tcp_read_sock())

    So code at line 1246 (tcp_read_sock()) seems wrong, or pessimistic at least.



    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2009-01-09 16:47    [W:4.162 / U:0.508 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site