Commit bf9b8556 authored by Jakub Kicinski's avatar Jakub Kicinski

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.usSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 154ba79c 15feb56e
...@@ -2826,6 +2826,8 @@ int unregister_netdevice_notifier(struct notifier_block *nb); ...@@ -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 register_netdevice_notifier_net(struct net *net, struct notifier_block *nb);
int unregister_netdevice_notifier_net(struct net *net, int unregister_netdevice_notifier_net(struct net *net,
struct notifier_block *nb); 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, int register_netdevice_notifier_dev_net(struct net_device *dev,
struct notifier_block *nb, struct notifier_block *nb,
struct netdev_net_notifier *nn); struct netdev_net_notifier *nn);
......
...@@ -1861,6 +1861,22 @@ int unregister_netdevice_notifier_net(struct net *net, ...@@ -1861,6 +1861,22 @@ int unregister_netdevice_notifier_net(struct net *net,
} }
EXPORT_SYMBOL(unregister_netdevice_notifier_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, int register_netdevice_notifier_dev_net(struct net_device *dev,
struct notifier_block *nb, struct notifier_block *nb,
struct netdev_net_notifier *nn) struct netdev_net_notifier *nn)
...@@ -1897,10 +1913,8 @@ static void move_netdevice_notifiers_dev_net(struct net_device *dev, ...@@ -1897,10 +1913,8 @@ static void move_netdevice_notifiers_dev_net(struct net_device *dev,
{ {
struct netdev_net_notifier *nn; struct netdev_net_notifier *nn;
list_for_each_entry(nn, &dev->net_notifier_list, list) { list_for_each_entry(nn, &dev->net_notifier_list, list)
__unregister_netdevice_notifier_net(dev_net(dev), nn->nb); __move_netdevice_notifier_net(dev_net(dev), net, nn->nb);
__register_netdevice_notifier_net(net, nn->nb, true);
}
} }
/** /**
......
...@@ -4502,8 +4502,11 @@ static int devlink_reload(struct devlink *devlink, struct net *dest_net, ...@@ -4502,8 +4502,11 @@ static int devlink_reload(struct devlink *devlink, struct net *dest_net,
if (err) if (err)
return 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); write_pnet(&devlink->_net, dest_net);
}
err = devlink->ops->reload_up(devlink, action, limit, actions_performed, extack); err = devlink->ops->reload_up(devlink, action, limit, actions_performed, extack);
devlink_reload_failed_set(devlink, !!err); devlink_reload_failed_set(devlink, !!err);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment