aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6/mcast.c
diff options
context:
space:
mode:
authorWANG Cong <xiyou.wangcong@gmail.com>2014-09-11 18:35:14 -0400
committerDavid S. Miller <davem@davemloft.net>2014-09-13 16:38:42 -0400
commit414b6c943fe25c5c576b6f0ce9077c29a150d826 (patch)
tree1d3fc15a88fa34cb42adad664e4cf4894e421f09 /net/ipv6/mcast.c
parentb5350916bfd49f737d73c4c512fbea1b3537c703 (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.c17
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