diff options
author | WANG Cong <xiyou.wangcong@gmail.com> | 2014-09-11 18:35:14 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-09-13 16:38:42 -0400 |
commit | 414b6c943fe25c5c576b6f0ce9077c29a150d826 (patch) | |
tree | 1d3fc15a88fa34cb42adad664e4cf4894e421f09 /net/ipv6/mcast.c | |
parent | b5350916bfd49f737d73c4c512fbea1b3537c703 (diff) |
ipv6: drop some rcu_read_lock in mcast
Similarly the code is already protected by rtnl lock.
Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/mcast.c')
-rw-r--r-- | net/ipv6/mcast.c | 17 |
1 files changed, 4 insertions, 13 deletions
diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c index 27ca0b741ccc..4fb761d4002d 100644 --- a/net/ipv6/mcast.c +++ b/net/ipv6/mcast.c | |||
@@ -162,7 +162,6 @@ int ipv6_sock_mc_join(struct sock *sk, int ifindex, const struct in6_addr *addr) | |||
162 | mc_lst->addr = *addr; | 162 | mc_lst->addr = *addr; |
163 | 163 | ||
164 | rtnl_lock(); | 164 | rtnl_lock(); |
165 | rcu_read_lock(); | ||
166 | if (ifindex == 0) { | 165 | if (ifindex == 0) { |
167 | struct rt6_info *rt; | 166 | struct rt6_info *rt; |
168 | rt = rt6_lookup(net, addr, NULL, 0, 0); | 167 | rt = rt6_lookup(net, addr, NULL, 0, 0); |
@@ -171,10 +170,9 @@ int ipv6_sock_mc_join(struct sock *sk, int ifindex, const struct in6_addr *addr) | |||
171 | ip6_rt_put(rt); | 170 | ip6_rt_put(rt); |
172 | } | 171 | } |
173 | } else | 172 | } else |
174 | dev = dev_get_by_index_rcu(net, ifindex); | 173 | dev = __dev_get_by_index(net, ifindex); |
175 | 174 | ||
176 | if (dev == NULL) { | 175 | if (dev == NULL) { |
177 | rcu_read_unlock(); | ||
178 | rtnl_unlock(); | 176 | rtnl_unlock(); |
179 | sock_kfree_s(sk, mc_lst, sizeof(*mc_lst)); | 177 | sock_kfree_s(sk, mc_lst, sizeof(*mc_lst)); |
180 | return -ENODEV; | 178 | return -ENODEV; |
@@ -192,7 +190,6 @@ int ipv6_sock_mc_join(struct sock *sk, int ifindex, const struct in6_addr *addr) | |||
192 | err = ipv6_dev_mc_inc(dev, addr); | 190 | err = ipv6_dev_mc_inc(dev, addr); |
193 | 191 | ||
194 | if (err) { | 192 | if (err) { |
195 | rcu_read_unlock(); | ||
196 | rtnl_unlock(); | 193 | rtnl_unlock(); |
197 | sock_kfree_s(sk, mc_lst, sizeof(*mc_lst)); | 194 | sock_kfree_s(sk, mc_lst, sizeof(*mc_lst)); |
198 | return err; | 195 | return err; |
@@ -201,7 +198,6 @@ int ipv6_sock_mc_join(struct sock *sk, int ifindex, const struct in6_addr *addr) | |||
201 | mc_lst->next = np->ipv6_mc_list; | 198 | mc_lst->next = np->ipv6_mc_list; |
202 | rcu_assign_pointer(np->ipv6_mc_list, mc_lst); | 199 | rcu_assign_pointer(np->ipv6_mc_list, mc_lst); |
203 | 200 | ||
204 | rcu_read_unlock(); | ||
205 | rtnl_unlock(); | 201 | rtnl_unlock(); |
206 | 202 | ||
207 | return 0; | 203 | return 0; |
@@ -230,8 +226,7 @@ int ipv6_sock_mc_drop(struct sock *sk, int ifindex, const struct in6_addr *addr) | |||
230 | 226 | ||
231 | *lnk = mc_lst->next; | 227 | *lnk = mc_lst->next; |
232 | 228 | ||
233 | rcu_read_lock(); | 229 | dev = __dev_get_by_index(net, mc_lst->ifindex); |
234 | dev = dev_get_by_index_rcu(net, mc_lst->ifindex); | ||
235 | if (dev != NULL) { | 230 | if (dev != NULL) { |
236 | struct inet6_dev *idev = __in6_dev_get(dev); | 231 | struct inet6_dev *idev = __in6_dev_get(dev); |
237 | 232 | ||
@@ -240,7 +235,6 @@ int ipv6_sock_mc_drop(struct sock *sk, int ifindex, const struct in6_addr *addr) | |||
240 | __ipv6_dev_mc_dec(idev, &mc_lst->addr); | 235 | __ipv6_dev_mc_dec(idev, &mc_lst->addr); |
241 | } else | 236 | } else |
242 | (void) ip6_mc_leave_src(sk, mc_lst, NULL); | 237 | (void) ip6_mc_leave_src(sk, mc_lst, NULL); |
243 | rcu_read_unlock(); | ||
244 | rtnl_unlock(); | 238 | rtnl_unlock(); |
245 | 239 | ||
246 | atomic_sub(sizeof(*mc_lst), &sk->sk_omem_alloc); | 240 | atomic_sub(sizeof(*mc_lst), &sk->sk_omem_alloc); |
@@ -299,8 +293,7 @@ void ipv6_sock_mc_close(struct sock *sk) | |||
299 | 293 | ||
300 | np->ipv6_mc_list = mc_lst->next; | 294 | np->ipv6_mc_list = mc_lst->next; |
301 | 295 | ||
302 | rcu_read_lock(); | 296 | dev = __dev_get_by_index(net, mc_lst->ifindex); |
303 | dev = dev_get_by_index_rcu(net, mc_lst->ifindex); | ||
304 | if (dev) { | 297 | if (dev) { |
305 | struct inet6_dev *idev = __in6_dev_get(dev); | 298 | struct inet6_dev *idev = __in6_dev_get(dev); |
306 | 299 | ||
@@ -309,7 +302,6 @@ void ipv6_sock_mc_close(struct sock *sk) | |||
309 | __ipv6_dev_mc_dec(idev, &mc_lst->addr); | 302 | __ipv6_dev_mc_dec(idev, &mc_lst->addr); |
310 | } else | 303 | } else |
311 | (void) ip6_mc_leave_src(sk, mc_lst, NULL); | 304 | (void) ip6_mc_leave_src(sk, mc_lst, NULL); |
312 | rcu_read_unlock(); | ||
313 | 305 | ||
314 | atomic_sub(sizeof(*mc_lst), &sk->sk_omem_alloc); | 306 | atomic_sub(sizeof(*mc_lst), &sk->sk_omem_alloc); |
315 | kfree_rcu(mc_lst, rcu); | 307 | kfree_rcu(mc_lst, rcu); |
@@ -934,7 +926,7 @@ int ipv6_dev_mc_dec(struct net_device *dev, const struct in6_addr *addr) | |||
934 | struct inet6_dev *idev; | 926 | struct inet6_dev *idev; |
935 | int err; | 927 | int err; |
936 | 928 | ||
937 | rcu_read_lock(); | 929 | ASSERT_RTNL(); |
938 | 930 | ||
939 | idev = __in6_dev_get(dev); | 931 | idev = __in6_dev_get(dev); |
940 | if (!idev) | 932 | if (!idev) |
@@ -942,7 +934,6 @@ int ipv6_dev_mc_dec(struct net_device *dev, const struct in6_addr *addr) | |||
942 | else | 934 | else |
943 | err = __ipv6_dev_mc_dec(idev, addr); | 935 | err = __ipv6_dev_mc_dec(idev, addr); |
944 | 936 | ||
945 | rcu_read_unlock(); | ||
946 | return err; | 937 | return err; |
947 | } | 938 | } |
948 | 939 | ||