diff options
| author | Stephen Hemminger <shemminger@osdl.org> | 2004-02-05 21:39:44 -0800 |
|---|---|---|
| committer | Stephen Hemminger <shemminger@osdl.org> | 2004-02-05 21:39:44 -0800 |
| commit | 6434c04175e058429430e2064d3a0ce112ce45ad (patch) | |
| tree | 4001117bad47dcd300748c89f9ea6fa9ef76d177 /net/core/dev.c | |
| parent | fa13a7b8fd68f4c00fc8c6905261b50a4733d8c3 (diff) | |
[NET]: Hash netdevices by ifindex for faster lookup.
Diffstat (limited to 'net/core/dev.c')
| -rw-r--r-- | net/core/dev.c | 22 |
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. */ |
