Commit bf9b8556 authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

Merge branch 'net-devlink-move-netdev-notifier-block-to-dest-namespace-during-reload'

Jiri Pirko says:

====================
net: devlink: move netdev notifier block to dest namespace during reload

Patch #1 is just a dependency of patch #2, which is the actual fix.
====================

Link: https://lore.kernel.org/r/20221108132208.938676-1-jiri@resnulli.us


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 154ba79c 15feb56e
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -2826,6 +2826,8 @@ int unregister_netdevice_notifier(struct notifier_block *nb);
int register_netdevice_notifier_net(struct net *net, struct notifier_block *nb);
int unregister_netdevice_notifier_net(struct net *net,
				      struct notifier_block *nb);
void move_netdevice_notifier_net(struct net *src_net, struct net *dst_net,
				 struct notifier_block *nb);
int register_netdevice_notifier_dev_net(struct net_device *dev,
					struct notifier_block *nb,
					struct netdev_net_notifier *nn);
+18 −4
Original line number Diff line number Diff line
@@ -1861,6 +1861,22 @@ int unregister_netdevice_notifier_net(struct net *net,
}
EXPORT_SYMBOL(unregister_netdevice_notifier_net);

static void __move_netdevice_notifier_net(struct net *src_net,
					  struct net *dst_net,
					  struct notifier_block *nb)
{
	__unregister_netdevice_notifier_net(src_net, nb);
	__register_netdevice_notifier_net(dst_net, nb, true);
}

void move_netdevice_notifier_net(struct net *src_net, struct net *dst_net,
				 struct notifier_block *nb)
{
	rtnl_lock();
	__move_netdevice_notifier_net(src_net, dst_net, nb);
	rtnl_unlock();
}

int register_netdevice_notifier_dev_net(struct net_device *dev,
					struct notifier_block *nb,
					struct netdev_net_notifier *nn)
@@ -1897,10 +1913,8 @@ static void move_netdevice_notifiers_dev_net(struct net_device *dev,
{
	struct netdev_net_notifier *nn;

	list_for_each_entry(nn, &dev->net_notifier_list, list) {
		__unregister_netdevice_notifier_net(dev_net(dev), nn->nb);
		__register_netdevice_notifier_net(net, nn->nb, true);
	}
	list_for_each_entry(nn, &dev->net_notifier_list, list)
		__move_netdevice_notifier_net(dev_net(dev), net, nn->nb);
}

/**
+4 −1
Original line number Diff line number Diff line
@@ -4502,8 +4502,11 @@ static int devlink_reload(struct devlink *devlink, struct net *dest_net,
	if (err)
		return err;

	if (dest_net && !net_eq(dest_net, curr_net))
	if (dest_net && !net_eq(dest_net, curr_net)) {
		move_netdevice_notifier_net(curr_net, dest_net,
					    &devlink->netdevice_nb);
		write_pnet(&devlink->_net, dest_net);
	}

	err = devlink->ops->reload_up(devlink, action, limit, actions_performed, extack);
	devlink_reload_failed_set(devlink, !!err);