On Fri, Jan 09, 2009 at 10:24:00PM +0100, Willy Tarreau wrote:OK finally I could reproduce it and found why we have this. It's expected in fact. The problem when we loop in tcp_read_sock() is that tss->len is not decremented by the amount of bytes read, this one is done only in tcp_splice_read() which is outer. The solution I found was to do just like other callers, which means use desc->count to keep the remaining number of bytes we want to read. In fact, tcp_read_sock() is designed to use that one as a stop condition, which explains why you first had to hide it. Now with the attached patch as a replacement for my previous one, both issues are solved : - I splice 1000 bytes if I ask to do so - I splice as much as possible if available (typically 23 kB). My observed performances are still at the top of earlier results and IMHO that way of counting bytes makes sense for an actor called from tcp_read_sock(). diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 35bcddf..51ff3aa 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -522,8 +522,12 @@ static int tcp_splice_data_recv(read_descriptor_t *rd_desc, struct sk_buff *skb, unsigned int offset, size_t len) { struct tcp_splice_state *tss = rd_desc->arg.data; + int ret; - return skb_splice_bits(skb, offset, tss->pipe, tss->len, tss->flags); + ret = skb_splice_bits(skb, offset, tss->pipe, rd_desc->count, tss->flags); + if (ret > 0) + rd_desc->count -= ret; + return ret; } static int __tcp_splice_read(struct sock *sk, struct tcp_splice_state *tss) @@ -531,6 +535,7 @@ static int __tcp_splice_read(struct sock *sk, struct tcp_splice_state *tss) /* Store TCP splice context information in read_descriptor_t. */ read_descriptor_t rd_desc = { .arg.data = tss, + .count = tss->len, }; return tcp_read_sock(sk, &rd_desc, tcp_splice_data_recv); Regards, Willy -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
| Andrew Morton | Re: Linux 2.6.21-rc4 |
| Andrew Morton | -mm merge plans for 2.6.23 |
| Greg KH | [GIT PATCH] driver core patches against 2.6.24 |
| Balbir Singh | Re: [RFC][PATCH 2/7] RSS controller core |
git: | |
| Gerrit Renker | [PATCH 15/37] dccp: Set per-connection CCIDs via socket options |
| David Miller | [GIT]: Networking |
| Andreas Henriksson | [PATCH 06/12] Remove bogus reference to tc-filters(8) from tc(8) manpage. |
| Jarek Poplawski | Re: [PATCH] pkt_sched: Destroy gen estimators under rtnl_lock(). |
