diff options
author | Eric Dumazet <edumazet@google.com> | 2012-04-19 09:38:17 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-04-21 16:36:42 -0400 |
commit | e66e9a31474dcce5be6f1186dc933d8a991c707b (patch) | |
tree | 10bcd8dd605738689797656753ecbbbbab33fe23 /net/core | |
parent | acd69962341a956b5bcc5b4178b70fa527d7ce11 (diff) | |
download | linux-e66e9a31474dcce5be6f1186dc933d8a991c707b.tar.gz linux-e66e9a31474dcce5be6f1186dc933d8a991c707b.tar.bz2 linux-e66e9a31474dcce5be6f1186dc933d8a991c707b.zip |
net: allow better page reuse in splice(sock -> pipe)
splice() from socket to pipe needs linear_to_page() helper to transfert
skb header to part of page.
We can reset the offset in the current sk->sk_sndmsg_page if we are the
last user of the page.
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core')
-rw-r--r-- | net/core/skbuff.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 43c490d52df6..bf257de95d26 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -1565,6 +1565,9 @@ new_page: } else { unsigned int mlen; + /* If we are the only user of the page, we can reset offset */ + if (page_count(p) == 1) + sk->sk_sndmsg_off = 0; off = sk->sk_sndmsg_off; mlen = PAGE_SIZE - off; if (mlen < 64 && mlen < *len) { |