From patchwork Fri Apr 27 12:10:03 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 155468 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 1B4B9B6F6E for ; Fri, 27 Apr 2012 22:10:16 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1760133Ab2D0MKN (ORCPT ); Fri, 27 Apr 2012 08:10:13 -0400 Received: from mail-bk0-f46.google.com ([209.85.214.46]:48424 "EHLO mail-bk0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1759994Ab2D0MKL (ORCPT ); Fri, 27 Apr 2012 08:10:11 -0400 Received: by bkuw12 with SMTP id w12so444626bku.19 for ; Fri, 27 Apr 2012 05:10:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=subject:from:to:cc:content-type:date:message-id:mime-version :x-mailer:content-transfer-encoding; bh=97MR9zRGsteLMzijxRjNKPITiK3qwhGEm6hzXV3kVsY=; b=QHndGeszWawQn/JWmu2QiLrxGLZVKbzebNFri/G69P0Xf/62F+rz5gmj0RHuaTpQ4k OMwxrzip97VbLteZJlgIU3+JIL4/IgWszSD8roIizJs7B/x/C695gGxL9ZM/I/eRnPiu oqMv/hd80nyuEUch9TCbBRu3wwD7T8UyMCAtzdQqXEXQshAK++nXKIiKX3dUDKGEbKnL iOssPMHwfOdXUhv6mhxFLJQHxdpCStJSsU5oysD061MsUvnby0jeeeCc1szyRyhXSQCR tsa8hUOIFBeeXrqv1+OhXxAhLR5HtY38OKMPaJeDKnku0h927ZMRORCQvR3+LL6n/el/ miVg== Received: by 10.204.156.90 with SMTP id v26mr3753290bkw.132.1335528610009; Fri, 27 Apr 2012 05:10:10 -0700 (PDT) Received: from [172.28.93.181] ([74.125.122.49]) by mx.google.com with ESMTPS id c4sm11303361bkh.0.2012.04.27.05.10.05 (version=SSLv3 cipher=OTHER); Fri, 27 Apr 2012 05:10:08 -0700 (PDT) Subject: [PATCH 5/5 net-next] net: makes skb_splice_bits() aware of skb->head_frag From: Eric Dumazet To: David Miller Cc: netdev , Neal Cardwell , Jeff Kirsher , Tom Herbert , Herbert Xu , Ben Hutchings , Matt Carlson , Michael Chan , Maciej =?UTF-8?Q?=C5=BBenczykowski?= , Ilpo =?ISO-8859-1?Q?J=E4rvinen?= Date: Fri, 27 Apr 2012 14:10:03 +0200 Message-ID: <1335528603.2775.246.camel@edumazet-glaptop> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Eric Dumazet __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 --- net/core/skbuff.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) -- 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 diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 2ad1ee7..e5bd086 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; /*