From: Eric Dumazet Date: Fri, 27 Apr 2012 02:10:03 +0000 (+0000) Subject: net: makes skb_splice_bits() aware of skb->head_frag X-Git-Tag: v3.5-rc1~109^2~233 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1d0c0b328a63826b7c80c27d1c4f2b04e8225273;p=profile%2Fivi%2Fkernel-x86-ivi.git net: makes skb_splice_bits() aware of skb->head_frag __skb_splice_bits() can check if skb to be spliced has its skb->head mapped to a page fragment, instead of a kmalloc() area. If so we can avoid a copy of the skb head and get a reference on underlying page. Signed-off-by: Eric Dumazet Cc: Ilpo Järvinen Cc: Herbert Xu Cc: Maciej Żenczykowski Cc: Neal Cardwell Cc: Tom Herbert Cc: Jeff Kirsher Cc: Ben Hutchings Cc: Matt Carlson Cc: Michael Chan Signed-off-by: David S. Miller --- diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 09cc386..52ba2b5 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -1699,14 +1699,18 @@ static bool __skb_splice_bits(struct sk_buff *skb, struct pipe_inode_info *pipe, struct splice_pipe_desc *spd, struct sock *sk) { int seg; + bool head_is_linear = !skb->head_frag; - /* - * map the linear part + /* map the linear part : + * If skb->head_frag is set, this 'linear' part is backed + * by a fragment, and we can avoid a copy. */ if (__splice_segment(virt_to_page(skb->data), (unsigned long) skb->data & (PAGE_SIZE - 1), skb_headlen(skb), - offset, len, skb, spd, true, sk, pipe)) + offset, len, skb, spd, + head_is_linear, + sk, pipe)) return true; /*