Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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/20231128115255.773377-1-jiri@resnulli.us
Signed-off-by: Paolo Abeni <pabeni@redhat.com>

+26 -3
+15 -1
net/devlink/dev.c
··· 425 425 devlink_rel_nested_in_notify(devlink); 426 426 } 427 427 428 + static void devlink_reload_reinit_sanity_check(struct devlink *devlink) 429 + { 430 + WARN_ON(!list_empty(&devlink->trap_policer_list)); 431 + WARN_ON(!list_empty(&devlink->trap_group_list)); 432 + WARN_ON(!list_empty(&devlink->trap_list)); 433 + WARN_ON(!list_empty(&devlink->dpipe_table_list)); 434 + WARN_ON(!list_empty(&devlink->sb_list)); 435 + WARN_ON(!list_empty(&devlink->rate_list)); 436 + WARN_ON(!list_empty(&devlink->linecard_list)); 437 + WARN_ON(!xa_empty(&devlink->ports)); 438 + } 439 + 428 440 int devlink_reload(struct devlink *devlink, struct net *dest_net, 429 441 enum devlink_reload_action action, 430 442 enum devlink_reload_limit limit, ··· 464 452 if (dest_net && !net_eq(dest_net, curr_net)) 465 453 devlink_reload_netns_change(devlink, curr_net, dest_net); 466 454 467 - if (action == DEVLINK_RELOAD_ACTION_DRIVER_REINIT) 455 + if (action == DEVLINK_RELOAD_ACTION_DRIVER_REINIT) { 468 456 devlink_params_driverinit_load_new(devlink); 457 + devlink_reload_reinit_sanity_check(devlink); 458 + } 469 459 470 460 err = devlink->ops->reload_up(devlink, action, limit, actions_performed, extack); 471 461 devlink_reload_failed_set(devlink, !!err);