mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	net: Hold rtnl_net_lock() in (un)?register_netdevice_notifier_dev_net().
(un)?register_netdevice_notifier_dev_net() hold RTNL before triggering the notifier for all netdev in the netns. Let's convert the RTNL to rtnl_net_lock(). Note that move_netdevice_notifiers_dev_net() is assumed to be (but not yet) protected by per-netns RTNL of both src and dst netns; we need to convert wireless and hyperv drivers that call dev_change_net_namespace(). Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com> Link: https://patch.msgid.link/20250106070751.63146-4-kuniyu@amazon.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
		
							parent
							
								
									ca779f4065
								
							
						
					
					
						commit
						7fb1073300
					
				
					 1 changed files with 10 additions and 6 deletions
				
			
		| 
						 | 
				
			
			@ -1946,15 +1946,17 @@ int register_netdevice_notifier_dev_net(struct net_device *dev,
 | 
			
		|||
					struct notifier_block *nb,
 | 
			
		||||
					struct netdev_net_notifier *nn)
 | 
			
		||||
{
 | 
			
		||||
	struct net *net = dev_net(dev);
 | 
			
		||||
	int err;
 | 
			
		||||
 | 
			
		||||
	rtnl_lock();
 | 
			
		||||
	err = __register_netdevice_notifier_net(dev_net(dev), nb, false);
 | 
			
		||||
	rtnl_net_lock(net);
 | 
			
		||||
	err = __register_netdevice_notifier_net(net, nb, false);
 | 
			
		||||
	if (!err) {
 | 
			
		||||
		nn->nb = nb;
 | 
			
		||||
		list_add(&nn->list, &dev->net_notifier_list);
 | 
			
		||||
	}
 | 
			
		||||
	rtnl_unlock();
 | 
			
		||||
	rtnl_net_unlock(net);
 | 
			
		||||
 | 
			
		||||
	return err;
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL(register_netdevice_notifier_dev_net);
 | 
			
		||||
| 
						 | 
				
			
			@ -1963,12 +1965,14 @@ int unregister_netdevice_notifier_dev_net(struct net_device *dev,
 | 
			
		|||
					  struct notifier_block *nb,
 | 
			
		||||
					  struct netdev_net_notifier *nn)
 | 
			
		||||
{
 | 
			
		||||
	struct net *net = dev_net(dev);
 | 
			
		||||
	int err;
 | 
			
		||||
 | 
			
		||||
	rtnl_lock();
 | 
			
		||||
	rtnl_net_lock(net);
 | 
			
		||||
	list_del(&nn->list);
 | 
			
		||||
	err = __unregister_netdevice_notifier_net(dev_net(dev), nb);
 | 
			
		||||
	rtnl_unlock();
 | 
			
		||||
	err = __unregister_netdevice_notifier_net(net, nb);
 | 
			
		||||
	rtnl_net_unlock(net);
 | 
			
		||||
 | 
			
		||||
	return err;
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL(unregister_netdevice_notifier_dev_net);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue