aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Dumazet <eric.dumazet@gmail.com>2010-03-18 07:27:25 -0400
committerDavid S. Miller <davem@davemloft.net>2010-03-21 23:33:36 -0400
commit99fe3c391d50d381687fd84ed0ab22d57079e41f (patch)
tree5e7e88d73d0d96e60c3471ab4812b847a413645d
parentec733b15a3ef0b5759141a177f8044a2f40c41e7 (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.c17
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
773struct net_device *dev_getfirstbyhwtype(struct net *net, unsigned short type) 773struct 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}
784EXPORT_SYMBOL(dev_getfirstbyhwtype); 787EXPORT_SYMBOL(dev_getfirstbyhwtype);
785 788