提交 dbdd9a52 编写于 作者: D David S. Miller

ipv4: Remove redundant RCU locking in ip_check_mc().

All callers are under rcu_read_lock() protection already.

Rename to ip_check_mc_rcu() to make it even more clear.
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 33175d84
...@@ -217,7 +217,7 @@ struct ip_mc_list { ...@@ -217,7 +217,7 @@ struct ip_mc_list {
#define IGMPV3_QQIC(value) IGMPV3_EXP(0x80, 4, 3, value) #define IGMPV3_QQIC(value) IGMPV3_EXP(0x80, 4, 3, value)
#define IGMPV3_MRC(value) IGMPV3_EXP(0x80, 4, 3, value) #define IGMPV3_MRC(value) IGMPV3_EXP(0x80, 4, 3, value)
extern int ip_check_mc(struct in_device *dev, __be32 mc_addr, __be32 src_addr, u16 proto); extern int ip_check_mc_rcu(struct in_device *dev, __be32 mc_addr, __be32 src_addr, u16 proto);
extern int igmp_rcv(struct sk_buff *); extern int igmp_rcv(struct sk_buff *);
extern int ip_mc_join_group(struct sock *sk, struct ip_mreqn *imr); extern int ip_mc_join_group(struct sock *sk, struct ip_mreqn *imr);
extern int ip_mc_leave_group(struct sock *sk, struct ip_mreqn *imr); extern int ip_mc_leave_group(struct sock *sk, struct ip_mreqn *imr);
......
...@@ -2333,13 +2333,13 @@ void ip_mc_drop_socket(struct sock *sk) ...@@ -2333,13 +2333,13 @@ void ip_mc_drop_socket(struct sock *sk)
rtnl_unlock(); rtnl_unlock();
} }
int ip_check_mc(struct in_device *in_dev, __be32 mc_addr, __be32 src_addr, u16 proto) /* called with rcu_read_lock() */
int ip_check_mc_rcu(struct in_device *in_dev, __be32 mc_addr, __be32 src_addr, u16 proto)
{ {
struct ip_mc_list *im; struct ip_mc_list *im;
struct ip_sf_list *psf; struct ip_sf_list *psf;
int rv = 0; int rv = 0;
rcu_read_lock();
for_each_pmc_rcu(in_dev, im) { for_each_pmc_rcu(in_dev, im) {
if (im->multiaddr == mc_addr) if (im->multiaddr == mc_addr)
break; break;
...@@ -2361,7 +2361,6 @@ int ip_check_mc(struct in_device *in_dev, __be32 mc_addr, __be32 src_addr, u16 p ...@@ -2361,7 +2361,6 @@ int ip_check_mc(struct in_device *in_dev, __be32 mc_addr, __be32 src_addr, u16 p
} else } else
rv = 1; /* unspecified source; tentatively allow */ rv = 1; /* unspecified source; tentatively allow */
} }
rcu_read_unlock();
return rv; return rv;
} }
......
...@@ -2309,8 +2309,8 @@ int ip_route_input_common(struct sk_buff *skb, __be32 daddr, __be32 saddr, ...@@ -2309,8 +2309,8 @@ int ip_route_input_common(struct sk_buff *skb, __be32 daddr, __be32 saddr,
struct in_device *in_dev = __in_dev_get_rcu(dev); struct in_device *in_dev = __in_dev_get_rcu(dev);
if (in_dev) { if (in_dev) {
int our = ip_check_mc(in_dev, daddr, saddr, int our = ip_check_mc_rcu(in_dev, daddr, saddr,
ip_hdr(skb)->protocol); ip_hdr(skb)->protocol);
if (our if (our
#ifdef CONFIG_IP_MROUTE #ifdef CONFIG_IP_MROUTE
|| ||
...@@ -2368,8 +2368,8 @@ static struct rtable *__mkroute_output(const struct fib_result *res, ...@@ -2368,8 +2368,8 @@ static struct rtable *__mkroute_output(const struct fib_result *res,
fi = NULL; fi = NULL;
} else if (type == RTN_MULTICAST) { } else if (type == RTN_MULTICAST) {
flags |= RTCF_MULTICAST | RTCF_LOCAL; flags |= RTCF_MULTICAST | RTCF_LOCAL;
if (!ip_check_mc(in_dev, oldflp->fl4_dst, oldflp->fl4_src, if (!ip_check_mc_rcu(in_dev, oldflp->fl4_dst, oldflp->fl4_src,
oldflp->proto)) oldflp->proto))
flags &= ~RTCF_LOCAL; flags &= ~RTCF_LOCAL;
/* If multicast route do not exist use /* If multicast route do not exist use
* default one, but do not gateway in this case. * default one, but do not gateway in this case.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册