From patchwork Fri Nov 13 05:20:19 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Octavian Purdila X-Patchwork-Id: 38339 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.176.167]) by ozlabs.org (Postfix) with ESMTP id 02C5BB7BC8 for ; Fri, 13 Nov 2009 16:23:30 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751412AbZKMFXT (ORCPT ); Fri, 13 Nov 2009 00:23:19 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1750913AbZKMFXT (ORCPT ); Fri, 13 Nov 2009 00:23:19 -0500 Received: from ixro-out-rtc.ixiacom.com ([92.87.192.98]:19514 "EHLO ixro-ex1.ixiacom.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750834AbZKMFXS (ORCPT ); Fri, 13 Nov 2009 00:23:18 -0500 Received: from ixro-opurdila-lap.localnet ([10.205.9.170]) by ixro-ex1.ixiacom.com with Microsoft SMTPSVC(6.0.3790.3959); Fri, 13 Nov 2009 07:23:23 +0200 From: Octavian Purdila Organization: Ixia To: netdev@vger.kernel.org Subject: Re: [net-next-2.6 PATCH] net: fast consecutive name allocation Date: Fri, 13 Nov 2009 07:20:19 +0200 User-Agent: KMail/1.12.2 (Linux/2.6.31-trunk-686; KDE/4.3.2; i686; ; ) References: <200911130701.14847.opurdila@ixiacom.com> In-Reply-To: <200911130701.14847.opurdila@ixiacom.com> MIME-Version: 1.0 Message-Id: <200911130720.19671.opurdila@ixiacom.com> X-OriginalArrivalTime: 13 Nov 2009 05:23:23.0589 (UTC) FILETIME=[6BA0F750:01CA6421] Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org On Friday 13 November 2009 07:01:14 you wrote: > This patch speeds up the network device name allocation for the case > where a significant number of devices of the same type are created > consecutively. > > Tests performed on a PPC750 @ 800Mhz machine with per device sysctl > and sysfs entries disabled: > > Without the patch With the patch > > real 0m 43.43s real 0m 0.49s > user 0m 0.00s user 0m 0.00s > sys 0m 43.43s sys 0m 0.48s > Oops, pasting root prompts (e.g. # modprobe ....) directly into the git commit message is not a good idea :) Here it is again, with the full commit message. [net-next-2.6 PATCH] net: fast consecutive name allocation This patch speeds up the network device name allocation for the case where a significant number of devices of the same type are created consecutively. Tests performed on a PPC750 @ 800Mhz machine with per device sysctl and sysfs entries disabled: $ time insmod /lib/modules/dummy.ko numdummies=8000 Without the patch With the patch real 0m 43.43s real 0m 0.49s user 0m 0.00s user 0m 0.00s sys 0m 43.43s sys 0m 0.48s Signed-off-by: Octavian Purdila --- include/net/net_namespace.h | 3 +++ net/core/dev.c | 23 ++++++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletions(-) diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h index 0addd45..39c65a2 100644 --- a/include/net/net_namespace.h +++ b/include/net/net_namespace.h @@ -56,6 +56,9 @@ struct net { struct list_head dev_base_head; struct hlist_head *dev_name_head; struct hlist_head *dev_index_head; + /* fast consecutive name allocation (e.g. eth0, eth1, ...) */ + char fcna_name[IFNAMSIZ]; + int fcna_no; /* core fib_rules */ struct list_head rules_ops; diff --git a/net/core/dev.c b/net/core/dev.c index ad8e320..008e3c7 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -226,8 +226,12 @@ static int list_netdevice(struct net_device *dev) */ static void unlist_netdevice(struct net_device *dev) { + struct net *net = dev_net(dev); + ASSERT_RTNL(); + net->fcna_no = -1; + /* Unlink dev from the device chain */ write_lock_bh(&dev_base_lock); list_del_rcu(&dev->dev_list); @@ -872,6 +876,16 @@ static int __dev_alloc_name(struct net *net, const char *name, char *buf) if (p[1] != 'd' || strchr(p + 2, '%')) return -EINVAL; + /* avoid fast allocation for strange templates like "fan%dcy" */ + if (net->fcna_no >= 0 && p[2] == 0 && + net->fcna_name[p - name] == 0 && + memcmp(name, net->fcna_name, p - name) == 0) { + snprintf(buf, IFNAMSIZ, name, ++net->fcna_no); + if (!__dev_get_by_name(net, buf)) + return net->fcna_no; + net->fcna_no = -1; + } + /* Use one page as a bit array of possible slots */ inuse = (unsigned long *) get_zeroed_page(GFP_ATOMIC); if (!inuse) @@ -894,8 +908,15 @@ static int __dev_alloc_name(struct net *net, const char *name, char *buf) } snprintf(buf, IFNAMSIZ, name, i); - if (!__dev_get_by_name(net, buf)) + if (!__dev_get_by_name(net, buf)) { + if (p[2] == 0) { + memcpy(net->fcna_name, name, p - name); + net->fcna_name[p - name] = 0; + net->fcna_no = i; + } else + net->fcna_no = -1; return i; + } /* It is possible to run out of possible slots * when the name is long and there isn't enough space left