netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [net-next-2.6 PATCH] net: fast consecutive name allocation
@ 2009-11-13  5:01 Octavian Purdila
  2009-11-13  5:20 ` Octavian Purdila
  0 siblings, 1 reply; 28+ messages in thread
From: Octavian Purdila @ 2009-11-13  5:01 UTC (permalink / raw)
  To: netdev

[-- Attachment #1: Type: text/plain, Size: 621 bytes --]


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

Signed-off-by: Octavian Purdila <opurdila@ixiacom.com>
---
 include/net/net_namespace.h |    3 +++
 net/core/dev.c              |   23 ++++++++++++++++++++++-
 2 files changed, 25 insertions(+), 1 deletions(-)

[-- Attachment #2: 3ad8e007a0c929204c3ee7e7afa309e2e53b5b8a.diff --]
[-- Type: text/x-patch, Size: 2073 bytes --]

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

^ permalink raw reply related	[flat|nested] 28+ messages in thread

end of thread, other threads:[~2009-11-15 16:50 UTC | newest]

Thread overview: 28+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-11-13  5:01 [net-next-2.6 PATCH] net: fast consecutive name allocation Octavian Purdila
2009-11-13  5:20 ` Octavian Purdila
2009-11-13  6:12   ` Eric Dumazet
2009-11-13  6:26     ` Stephen Hemminger
2009-11-13  7:09       ` Eric Dumazet
2009-11-13  9:51       ` Octavian Purdila
2009-11-13 22:29         ` Stephen Hemminger
2009-11-13 22:40           ` Benjamin LaHaise
2009-11-13 22:49             ` Stephen Hemminger
2009-11-13 23:35               ` Benjamin LaHaise
2009-11-13 23:39                 ` Stephen Hemminger
2009-11-13 23:52                   ` Benjamin LaHaise
2009-11-14  2:59                     ` David Miller
2009-11-14  6:24                       ` Benjamin LaHaise
2009-11-14 22:36                       ` Mark Smith
2009-11-15  1:22                         ` Stephen Hemminger
2009-11-15  1:49                           ` Mark Smith
2009-11-15  1:55                         ` Denys Fedoryschenko
2009-11-15  7:48                           ` Eric Dumazet
2009-11-15 16:50                           ` Benjamin LaHaise
2009-11-14  7:08               ` Benny Amorsen
2009-11-14  7:21                 ` Eric Dumazet
2009-11-14 16:16                   ` Ben Greear
2009-11-13  9:55     ` Octavian Purdila
2009-11-13 16:40       ` Ben Greear
2009-11-14  0:04   ` Stephen Hemminger
2009-11-14  0:14     ` Octavian Purdila
2009-11-14  0:20       ` Stephen Hemminger

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).