diff options
author | Eric Dumazet <eric.dumazet@gmail.com> | 2010-03-18 07:27:25 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-03-21 23:33:36 -0400 |
commit | 99fe3c391d50d381687fd84ed0ab22d57079e41f (patch) | |
tree | 5e7e88d73d0d96e60c3471ab4812b847a413645d | |
parent | ec733b15a3ef0b5759141a177f8044a2f40c41e7 (diff) |
net: dev_getfirstbyhwtype() optimization
Use RCU to avoid RTNL use in dev_getfirstbyhwtype()
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/core/dev.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 2d01f18f303a..a03aab45e84f 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -772,14 +772,17 @@ EXPORT_SYMBOL(__dev_getfirstbyhwtype); | |||
772 | 772 | ||
773 | struct net_device *dev_getfirstbyhwtype(struct net *net, unsigned short type) | 773 | struct net_device *dev_getfirstbyhwtype(struct net *net, unsigned short type) |
774 | { | 774 | { |
775 | struct net_device *dev; | 775 | struct net_device *dev, *ret = NULL; |
776 | 776 | ||
777 | rtnl_lock(); | 777 | rcu_read_lock(); |
778 | dev = __dev_getfirstbyhwtype(net, type); | 778 | for_each_netdev_rcu(net, dev) |
779 | if (dev) | 779 | if (dev->type == type) { |
780 | dev_hold(dev); | 780 | dev_hold(dev); |
781 | rtnl_unlock(); | 781 | ret = dev; |
782 | return dev; | 782 | break; |
783 | } | ||
784 | rcu_read_unlock(); | ||
785 | return ret; | ||
783 | } | 786 | } |
784 | EXPORT_SYMBOL(dev_getfirstbyhwtype); | 787 | EXPORT_SYMBOL(dev_getfirstbyhwtype); |
785 | 788 | ||