Skip to content

Commit bf9b855

Browse files
committed
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: Jakub Kicinski <kuba@kernel.org>
2 parents 154ba79 + 15feb56 commit bf9b855

3 files changed

Lines changed: 24 additions & 5 deletions

File tree

include/linux/netdevice.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2826,6 +2826,8 @@ int unregister_netdevice_notifier(struct notifier_block *nb);
28262826
int register_netdevice_notifier_net(struct net *net, struct notifier_block *nb);
28272827
int unregister_netdevice_notifier_net(struct net *net,
28282828
struct notifier_block *nb);
2829+
void move_netdevice_notifier_net(struct net *src_net, struct net *dst_net,
2830+
struct notifier_block *nb);
28292831
int register_netdevice_notifier_dev_net(struct net_device *dev,
28302832
struct notifier_block *nb,
28312833
struct netdev_net_notifier *nn);

net/core/dev.c

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1861,6 +1861,22 @@ int unregister_netdevice_notifier_net(struct net *net,
18611861
}
18621862
EXPORT_SYMBOL(unregister_netdevice_notifier_net);
18631863

1864+
static void __move_netdevice_notifier_net(struct net *src_net,
1865+
struct net *dst_net,
1866+
struct notifier_block *nb)
1867+
{
1868+
__unregister_netdevice_notifier_net(src_net, nb);
1869+
__register_netdevice_notifier_net(dst_net, nb, true);
1870+
}
1871+
1872+
void move_netdevice_notifier_net(struct net *src_net, struct net *dst_net,
1873+
struct notifier_block *nb)
1874+
{
1875+
rtnl_lock();
1876+
__move_netdevice_notifier_net(src_net, dst_net, nb);
1877+
rtnl_unlock();
1878+
}
1879+
18641880
int register_netdevice_notifier_dev_net(struct net_device *dev,
18651881
struct notifier_block *nb,
18661882
struct netdev_net_notifier *nn)
@@ -1897,10 +1913,8 @@ static void move_netdevice_notifiers_dev_net(struct net_device *dev,
18971913
{
18981914
struct netdev_net_notifier *nn;
18991915

1900-
list_for_each_entry(nn, &dev->net_notifier_list, list) {
1901-
__unregister_netdevice_notifier_net(dev_net(dev), nn->nb);
1902-
__register_netdevice_notifier_net(net, nn->nb, true);
1903-
}
1916+
list_for_each_entry(nn, &dev->net_notifier_list, list)
1917+
__move_netdevice_notifier_net(dev_net(dev), net, nn->nb);
19041918
}
19051919

19061920
/**

net/core/devlink.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4502,8 +4502,11 @@ static int devlink_reload(struct devlink *devlink, struct net *dest_net,
45024502
if (err)
45034503
return err;
45044504

4505-
if (dest_net && !net_eq(dest_net, curr_net))
4505+
if (dest_net && !net_eq(dest_net, curr_net)) {
4506+
move_netdevice_notifier_net(curr_net, dest_net,
4507+
&devlink->netdevice_nb);
45064508
write_pnet(&devlink->_net, dest_net);
4509+
}
45074510

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

0 commit comments

Comments
 (0)