From fa13a7b8fd68f4c00fc8c6905261b50a4733d8c3 Mon Sep 17 00:00:00 2001 From: Stephen Hemminger Date: Thu, 5 Feb 2004 21:39:01 -0800 Subject: [NET]: Hash netdevices by name for faster lookup. --- include/linux/netdevice.h | 2 ++ 1 file changed, 2 insertions(+) (limited to 'include/linux/netdevice.h') diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 84b6fd41e2d2..11723ab7e2c5 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -375,6 +375,8 @@ struct net_device atomic_t refcnt; /* delayed register/unregister */ struct list_head todo_list; + /* device name hash chain */ + struct hlist_node name_hlist; /* register/unregister state machine */ enum { NETREG_UNINITIALIZED=0, -- cgit v1.2.3 From 6434c04175e058429430e2064d3a0ce112ce45ad Mon Sep 17 00:00:00 2001 From: Stephen Hemminger Date: Thu, 5 Feb 2004 21:39:44 -0800 Subject: [NET]: Hash netdevices by ifindex for faster lookup. --- include/linux/netdevice.h | 2 ++ net/core/dev.c | 22 ++++++++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) (limited to 'include/linux/netdevice.h') diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 11723ab7e2c5..1a77c3caf115 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -377,6 +377,8 @@ struct net_device struct list_head todo_list; /* device name hash chain */ struct hlist_node name_hlist; + /* device index hash chain */ + struct hlist_node index_hlist; /* register/unregister state machine */ enum { NETREG_UNINITIALIZED=0, diff --git a/net/core/dev.c b/net/core/dev.c index d5ba80179da6..17e1fa1b1815 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -188,6 +188,7 @@ EXPORT_SYMBOL(dev_base_lock); #define NETDEV_HASHBITS 8 static struct hlist_head dev_name_head[1<next) + hlist_for_each(p, dev_index_hash(ifindex)) { + struct net_device *dev + = hlist_entry(p, struct net_device, index_hlist); if (dev->ifindex == ifindex) - break; - return dev; + return dev; + } + return NULL; } @@ -2842,6 +2851,7 @@ int register_netdevice(struct net_device *dev) *dev_tail = dev; dev_tail = &dev->next; hlist_add_head(&dev->name_hlist, head); + hlist_add_head(&dev->index_hlist, dev_index_hash(dev->ifindex)); dev_hold(dev); dev->reg_state = NETREG_REGISTERING; write_unlock_bh(&dev_base_lock); @@ -3064,6 +3074,7 @@ int unregister_netdevice(struct net_device *dev) if (d == dev) { write_lock_bh(&dev_base_lock); hlist_del(&dev->name_hlist); + hlist_del(&dev->index_hlist); if (dev_tail == &dev->next) dev_tail = dp; *dp = d->next; @@ -3145,6 +3156,9 @@ static int __init net_dev_init(void) for (i = 0; i < ARRAY_SIZE(dev_name_head); i++) INIT_HLIST_HEAD(&dev_name_head[i]); + for (i = 0; i < ARRAY_SIZE(dev_index_head); i++) + INIT_HLIST_HEAD(&dev_index_head[i]); + /* * Initialise the packet receive queues. */ -- cgit v1.2.3