diff options
| author | Paolo Abeni <[email protected]> | 2023-11-30 12:31:39 +0100 |
|---|---|---|
| committer | Paolo Abeni <[email protected]> | 2023-11-30 12:31:39 +0100 |
| commit | 04447185dadbb2dfab2b5a3c73c76cbaccd8fbe1 (patch) | |
| tree | c12287a41f4bb5a0c3f4e6f1504fc53ce4ad8d07 /net/devlink/dev.c | |
| parent | e35174263f2c671603e8ccc997a16334087b782c (diff) | |
| parent | 9b2348e2d6c94146f50b68d7d2067146e7339ac5 (diff) | |
Merge branch 'devlink-warn-about-existing-entities-during-reload-reinit'
Jiri Pirko says:
====================
devlink: warn about existing entities during reload-reinit
Recently there has been a couple of attempts from drivers to block
devlink reload in certain situations. Turned out, the drivers do not
properly tear down ports and related netdevs during reload.
To address this, add couple of checks to be done during devlink reload
reinit action. Also, extend documentation to be more explicit.
====================
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Paolo Abeni <[email protected]>
Diffstat (limited to 'net/devlink/dev.c')
| -rw-r--r-- | net/devlink/dev.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/net/devlink/dev.c b/net/devlink/dev.c index ea6a92f2e6a2..918a0395b03e 100644 --- a/net/devlink/dev.c +++ b/net/devlink/dev.c @@ -425,6 +425,18 @@ static void devlink_reload_netns_change(struct devlink *devlink, devlink_rel_nested_in_notify(devlink); } +static void devlink_reload_reinit_sanity_check(struct devlink *devlink) +{ + WARN_ON(!list_empty(&devlink->trap_policer_list)); + WARN_ON(!list_empty(&devlink->trap_group_list)); + WARN_ON(!list_empty(&devlink->trap_list)); + WARN_ON(!list_empty(&devlink->dpipe_table_list)); + WARN_ON(!list_empty(&devlink->sb_list)); + WARN_ON(!list_empty(&devlink->rate_list)); + WARN_ON(!list_empty(&devlink->linecard_list)); + WARN_ON(!xa_empty(&devlink->ports)); +} + int devlink_reload(struct devlink *devlink, struct net *dest_net, enum devlink_reload_action action, enum devlink_reload_limit limit, @@ -452,8 +464,10 @@ int devlink_reload(struct devlink *devlink, struct net *dest_net, if (dest_net && !net_eq(dest_net, curr_net)) devlink_reload_netns_change(devlink, curr_net, dest_net); - if (action == DEVLINK_RELOAD_ACTION_DRIVER_REINIT) + if (action == DEVLINK_RELOAD_ACTION_DRIVER_REINIT) { devlink_params_driverinit_load_new(devlink); + devlink_reload_reinit_sanity_check(devlink); + } err = devlink->ops->reload_up(devlink, action, limit, actions_performed, extack); devlink_reload_failed_set(devlink, !!err); |