summaryrefslogtreecommitdiff
path: root/net/core/dev.c
diff options
context:
space:
mode:
authorStephen Hemminger <shemminger@osdl.org>2004-02-05 21:39:44 -0800
committerStephen Hemminger <shemminger@osdl.org>2004-02-05 21:39:44 -0800
commit6434c04175e058429430e2064d3a0ce112ce45ad (patch)
tree4001117bad47dcd300748c89f9ea6fa9ef76d177 /net/core/dev.c
parentfa13a7b8fd68f4c00fc8c6905261b50a4733d8c3 (diff)
[NET]: Hash netdevices by ifindex for faster lookup.
Diffstat (limited to 'net/core/dev.c')
-rw-r--r--net/core/dev.c22
1 files changed, 18 insertions, 4 deletions
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<<NETDEV_HASHBITS];
+static struct hlist_head dev_index_head[1<<NETDEV_HASHBITS];
static inline struct hlist_head *dev_name_hash(const char *name)
{
@@ -195,6 +196,11 @@ static inline struct hlist_head *dev_name_hash(const char *name)
return &dev_name_head[hash & ((1<<NETDEV_HASHBITS)-1)];
}
+static inline struct hlist_head *dev_index_hash(int ifindex)
+{
+ return &dev_index_head[ifindex & ((1<<NETDEV_HASHBITS)-1)];
+}
+
/*
* Our notifier list
*/
@@ -554,12 +560,15 @@ int __dev_get(const char *name)
struct net_device *__dev_get_by_index(int ifindex)
{
- struct net_device *dev;
+ struct hlist_node *p;
- for (dev = dev_base; dev; dev = dev->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.
*/