Messages in this thread | | | Date | Fri, 09 Jan 2009 16:42:44 +0100 | From | Eric Dumazet <> | Subject | Re: [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/
| |