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/decnet | |
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/decnet')
-rw-r--r-- | net/decnet/af_decnet.c | 6 | ||||
-rw-r--r-- | net/decnet/dn_fib.c | 6 | ||||
-rw-r--r-- | net/decnet/dn_route.c | 6 |
3 files changed, 9 insertions, 9 deletions
diff --git a/net/decnet/af_decnet.c b/net/decnet/af_decnet.c index 664965c87e16..2e355841ca99 100644 --- a/net/decnet/af_decnet.c +++ b/net/decnet/af_decnet.c | |||
@@ -749,9 +749,9 @@ static int dn_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | |||
749 | 749 | ||
750 | if (!(saddr->sdn_flags & SDF_WILD)) { | 750 | if (!(saddr->sdn_flags & SDF_WILD)) { |
751 | if (le16_to_cpu(saddr->sdn_nodeaddrl)) { | 751 | if (le16_to_cpu(saddr->sdn_nodeaddrl)) { |
752 | read_lock(&dev_base_lock); | 752 | rcu_read_lock(); |
753 | ldev = NULL; | 753 | ldev = NULL; |
754 | for_each_netdev(&init_net, dev) { | 754 | for_each_netdev_rcu(&init_net, dev) { |
755 | if (!dev->dn_ptr) | 755 | if (!dev->dn_ptr) |
756 | continue; | 756 | continue; |
757 | if (dn_dev_islocal(dev, dn_saddr2dn(saddr))) { | 757 | if (dn_dev_islocal(dev, dn_saddr2dn(saddr))) { |
@@ -759,7 +759,7 @@ static int dn_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | |||
759 | break; | 759 | break; |
760 | } | 760 | } |
761 | } | 761 | } |
762 | read_unlock(&dev_base_lock); | 762 | rcu_read_unlock(); |
763 | if (ldev == NULL) | 763 | if (ldev == NULL) |
764 | return -EADDRNOTAVAIL; | 764 | return -EADDRNOTAVAIL; |
765 | } | 765 | } |
diff --git a/net/decnet/dn_fib.c b/net/decnet/dn_fib.c index 27ea2e9b080a..fd641f65e092 100644 --- a/net/decnet/dn_fib.c +++ b/net/decnet/dn_fib.c | |||
@@ -607,8 +607,8 @@ static void dn_fib_del_ifaddr(struct dn_ifaddr *ifa) | |||
607 | ASSERT_RTNL(); | 607 | ASSERT_RTNL(); |
608 | 608 | ||
609 | /* Scan device list */ | 609 | /* Scan device list */ |
610 | read_lock(&dev_base_lock); | 610 | rcu_read_lock(); |
611 | for_each_netdev(&init_net, dev) { | 611 | for_each_netdev_rcu(&init_net, dev) { |
612 | dn_db = dev->dn_ptr; | 612 | dn_db = dev->dn_ptr; |
613 | if (dn_db == NULL) | 613 | if (dn_db == NULL) |
614 | continue; | 614 | continue; |
@@ -619,7 +619,7 @@ static void dn_fib_del_ifaddr(struct dn_ifaddr *ifa) | |||
619 | } | 619 | } |
620 | } | 620 | } |
621 | } | 621 | } |
622 | read_unlock(&dev_base_lock); | 622 | rcu_read_unlock(); |
623 | 623 | ||
624 | if (found_it == 0) { | 624 | if (found_it == 0) { |
625 | fib_magic(RTM_DELROUTE, RTN_LOCAL, ifa->ifa_local, 16, ifa); | 625 | fib_magic(RTM_DELROUTE, RTN_LOCAL, ifa->ifa_local, 16, ifa); |
diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c index 57662cabaf9b..860286a3921b 100644 --- a/net/decnet/dn_route.c +++ b/net/decnet/dn_route.c | |||
@@ -908,8 +908,8 @@ static int dn_route_output_slow(struct dst_entry **pprt, const struct flowi *old | |||
908 | dev_put(dev_out); | 908 | dev_put(dev_out); |
909 | goto out; | 909 | goto out; |
910 | } | 910 | } |
911 | read_lock(&dev_base_lock); | 911 | rcu_read_lock(); |
912 | for_each_netdev(&init_net, dev) { | 912 | for_each_netdev_rcu(&init_net, dev) { |
913 | if (!dev->dn_ptr) | 913 | if (!dev->dn_ptr) |
914 | continue; | 914 | continue; |
915 | if (!dn_dev_islocal(dev, oldflp->fld_src)) | 915 | if (!dn_dev_islocal(dev, oldflp->fld_src)) |
@@ -922,7 +922,7 @@ static int dn_route_output_slow(struct dst_entry **pprt, const struct flowi *old | |||
922 | dev_out = dev; | 922 | dev_out = dev; |
923 | break; | 923 | break; |
924 | } | 924 | } |
925 | read_unlock(&dev_base_lock); | 925 | rcu_read_unlock(); |
926 | if (dev_out == NULL) | 926 | if (dev_out == NULL) |
927 | goto out; | 927 | goto out; |
928 | dev_hold(dev_out); | 928 | dev_hold(dev_out); |