diff options
author | Eric Dumazet <eric.dumazet@gmail.com> | 2009-11-04 08:43:23 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-11-04 08:43:23 -0500 |
commit | c6d14c84566d6b70ad9dc1618db0dec87cca9300 (patch) | |
tree | 5ec75245cfda4d61e6b4506b6217f047ff4af01a /net/netrom/nr_route.c | |
parent | d0075634cf9d288988f57392a1f132d2053af961 (diff) |
net: Introduce for_each_netdev_rcu() iterator
Adds RCU management to the list of netdevices.
Convert some for_each_netdev() users to RCU version, if
it can avoid read_lock-ing dev_base_lock
Ie:
read_lock(&dev_base_loack);
for_each_netdev(net, dev)
some_action();
read_unlock(&dev_base_lock);
becomes :
rcu_read_lock();
for_each_netdev_rcu(net, dev)
some_action();
rcu_read_unlock();
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/netrom/nr_route.c')
-rw-r--r-- | net/netrom/nr_route.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/net/netrom/nr_route.c b/net/netrom/nr_route.c index 4eb1ac9a7679..aacba76070fc 100644 --- a/net/netrom/nr_route.c +++ b/net/netrom/nr_route.c | |||
@@ -597,15 +597,15 @@ struct net_device *nr_dev_first(void) | |||
597 | { | 597 | { |
598 | struct net_device *dev, *first = NULL; | 598 | struct net_device *dev, *first = NULL; |
599 | 599 | ||
600 | read_lock(&dev_base_lock); | 600 | rcu_read_lock(); |
601 | for_each_netdev(&init_net, dev) { | 601 | for_each_netdev_rcu(&init_net, dev) { |
602 | if ((dev->flags & IFF_UP) && dev->type == ARPHRD_NETROM) | 602 | if ((dev->flags & IFF_UP) && dev->type == ARPHRD_NETROM) |
603 | if (first == NULL || strncmp(dev->name, first->name, 3) < 0) | 603 | if (first == NULL || strncmp(dev->name, first->name, 3) < 0) |
604 | first = dev; | 604 | first = dev; |
605 | } | 605 | } |
606 | if (first) | 606 | if (first) |
607 | dev_hold(first); | 607 | dev_hold(first); |
608 | read_unlock(&dev_base_lock); | 608 | rcu_read_unlock(); |
609 | 609 | ||
610 | return first; | 610 | return first; |
611 | } | 611 | } |
@@ -617,16 +617,17 @@ struct net_device *nr_dev_get(ax25_address *addr) | |||
617 | { | 617 | { |
618 | struct net_device *dev; | 618 | struct net_device *dev; |
619 | 619 | ||
620 | read_lock(&dev_base_lock); | 620 | rcu_read_lock(); |
621 | for_each_netdev(&init_net, dev) { | 621 | for_each_netdev_rcu(&init_net, dev) { |
622 | if ((dev->flags & IFF_UP) && dev->type == ARPHRD_NETROM && ax25cmp(addr, (ax25_address *)dev->dev_addr) == 0) { | 622 | if ((dev->flags & IFF_UP) && dev->type == ARPHRD_NETROM && |
623 | ax25cmp(addr, (ax25_address *)dev->dev_addr) == 0) { | ||
623 | dev_hold(dev); | 624 | dev_hold(dev); |
624 | goto out; | 625 | goto out; |
625 | } | 626 | } |
626 | } | 627 | } |
627 | dev = NULL; | 628 | dev = NULL; |
628 | out: | 629 | out: |
629 | read_unlock(&dev_base_lock); | 630 | rcu_read_unlock(); |
630 | return dev; | 631 | return dev; |
631 | } | 632 | } |
632 | 633 | ||