diff --git a/net/devlink/core.c b/net/devlink/core.c index bddbbbf000fe..9b844e0c1bd2 100644 --- a/net/devlink/core.c +++ b/net/devlink/core.c @@ -585,6 +585,8 @@ static void __net_exit devlink_pernet_pre_exit(struct net *net) DEVLINK_RELOAD_ACTION_DRIVER_REINIT, DEVLINK_RELOAD_LIMIT_UNSPEC, &actions_performed, NULL); + if (err && net_eq(devlink_net(devlink), net)) + devlink_reload_netns_change(devlink, net, &init_net); devl_dev_unlock(devlink, true); devlink_put(devlink); if (err && err != -EOPNOTSUPP) diff --git a/net/devlink/dev.c b/net/devlink/dev.c index b85bb02a9e80..b7e5aebf13be 100644 --- a/net/devlink/dev.c +++ b/net/devlink/dev.c @@ -412,9 +412,9 @@ static struct net *devlink_netns_get(struct sk_buff *skb, return net; } -static void devlink_reload_netns_change(struct devlink *devlink, - struct net *curr_net, - struct net *dest_net) +void devlink_reload_netns_change(struct devlink *devlink, + struct net *curr_net, + struct net *dest_net) { /* Userspace needs to be notified about devlink objects * removed from original and entering new network namespace. diff --git a/net/devlink/devl_internal.h b/net/devlink/devl_internal.h index cdf894ba5a9d..798e707002b9 100644 --- a/net/devlink/devl_internal.h +++ b/net/devlink/devl_internal.h @@ -324,6 +324,9 @@ struct devlink_port *devlink_port_get_from_attrs(struct devlink *devlink, /* Reload */ bool devlink_reload_actions_valid(const struct devlink_ops *ops); +void devlink_reload_netns_change(struct devlink *devlink, + struct net *curr_net, + struct net *dest_net); int devlink_reload(struct devlink *devlink, struct net *dest_net, enum devlink_reload_action action, enum devlink_reload_limit limit,