From patchwork Mon Nov 29 16:16:32 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Changli Gao X-Patchwork-Id: 73445 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 50397B70FD for ; Tue, 30 Nov 2010 03:17:06 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754942Ab0K2QRA (ORCPT ); Mon, 29 Nov 2010 11:17:00 -0500 Received: from mail-gx0-f174.google.com ([209.85.161.174]:38816 "EHLO mail-gx0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752926Ab0K2QQ7 (ORCPT ); Mon, 29 Nov 2010 11:16:59 -0500 Received: by gxk1 with SMTP id 1so118223gxk.19 for ; Mon, 29 Nov 2010 08:16:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:from:to:cc:subject:date :message-id:x-mailer; bh=ee9Wg10mA4XX7lO8A8E6UoO6jPqU+V+E/La5c6H9mtk=; b=AAZtpuaGfnGNuZ1Fukwweba2KQVIVey/6z2oaquAHSvpE2yyXGG4RvVpkz+5U9JFCJ ojKCSrM58I3JQ+G+Ua09Q6gpFQ6iuaAw7qTrlXcxo9PS1uCuywGzRi6IQ1qo3GfuOrBd jnsu/Bu4z0iqFOXyLyxhsseHsj1V3Wyb/J9Mc= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer; b=LOhxOI8EqXVQIXzFZOuHi+yFJz6Zh8trm2JI1elkqkq/Xw3E9tWag8qovqxHW8x5pD bik4Fnsp7WU4R47uEuTsZ9OaW/Vn6KMhkxDqCTnnQWZRifmOOpymqELYf8fLxYQby+64 DcFuNfgg0+e31KeBlp3cs0QnFXy6FCuvBVGPc= Received: by 10.151.150.5 with SMTP id c5mr10604896ybo.139.1291047419069; Mon, 29 Nov 2010 08:16:59 -0800 (PST) Received: from localhost.localdomain ([221.239.34.230]) by mx.google.com with ESMTPS id q14sm3387781ybk.19.2010.11.29.08.16.49 (version=TLSv1/SSLv3 cipher=RC4-MD5); Mon, 29 Nov 2010 08:16:57 -0800 (PST) From: Changli Gao To: "David S. Miller" Cc: netdev@vger.kernel.org, Changli Gao Subject: [PATCH] net: avoid the unnecessary kmalloc Date: Tue, 30 Nov 2010 00:16:32 +0800 Message-Id: <1291047392-3057-1-git-send-email-xiaosuo@gmail.com> X-Mailer: git-send-email 1.7.1 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org If the old memory allocated by kmalloc() is larger than the new requested, pskb_expand_head() doesn't need to allocate a new one, unless the skb is cloned. Signed-off-by: Changli Gao --- net/core/skbuff.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) -- 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 104f844..3908329 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -778,6 +778,17 @@ int pskb_expand_head(struct sk_buff *skb, int nhead, int ntail, size = SKB_DATA_ALIGN(size); + if (!skb->cloned && + size + sizeof(struct skb_shared_info) <= ksize(skb->head)) { + memmove(skb->head + size, skb_shinfo(skb), + offsetof(struct skb_shared_info, + frags[skb_shinfo(skb)->nr_frags])); + memmove(skb->head + nhead, skb->head, + skb_tail_pointer(skb) - skb->head); + off = nhead; + goto adjust_others; + } + data = kmalloc(size + sizeof(struct skb_shared_info), gfp_mask); if (!data) goto nodata; @@ -816,6 +827,7 @@ int pskb_expand_head(struct sk_buff *skb, int nhead, int ntail, off = (data + nhead) - skb->head; skb->head = data; +adjust_others: skb->data += off; #ifdef NET_SKBUFF_DATA_USES_OFFSET skb->end = size;