[IPV4]: Replace __in_dev_get with __in_dev_get_rcu/rtnl
The following patch renames __in_dev_get() to __in_dev_get_rtnl() and introduces __in_dev_get_rcu() to cover the second case. 1) RCU with refcnt should use in_dev_get(). 2) RCU without refcnt should use __in_dev_get_rcu(). 3) All others must hold RTNL and use __in_dev_get_rtnl(). There is one exception in net/ipv4/route.c which is in fact a pre-existing race condition. I've marked it as such so that we remember to fix it. This patch is based on suggestions and prior work by Suzanne Wood and Paul McKenney. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
a5e7c210fe
commit
e5ed639913
@ -173,7 +173,7 @@ int fib_validate_source(u32 src, u32 dst, u8 tos, int oif,
|
||||
|
||||
no_addr = rpf = 0;
|
||||
rcu_read_lock();
|
||||
in_dev = __in_dev_get(dev);
|
||||
in_dev = __in_dev_get_rcu(dev);
|
||||
if (in_dev) {
|
||||
no_addr = in_dev->ifa_list == NULL;
|
||||
rpf = IN_DEV_RPFILTER(in_dev);
|
||||
@ -607,7 +607,7 @@ static int fib_inetaddr_event(struct notifier_block *this, unsigned long event,
|
||||
static int fib_netdev_event(struct notifier_block *this, unsigned long event, void *ptr)
|
||||
{
|
||||
struct net_device *dev = ptr;
|
||||
struct in_device *in_dev = __in_dev_get(dev);
|
||||
struct in_device *in_dev = __in_dev_get_rtnl(dev);
|
||||
|
||||
if (event == NETDEV_UNREGISTER) {
|
||||
fib_disable_ip(dev, 2);
|
||||
|
Reference in New Issue
Block a user