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

Merge branch 'devlink-next'

Jakub Kicinski says:

====================
devlink: fix reload notifications and remove features

First two patches adjust notifications during devlink reload.
The last patch removes no longer needed devlink features.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
Reviewed-by: Jakub Kicinski <kuba@kernel.org>

+17 -67
-1
drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
··· 1303 1303 if (rc) 1304 1304 goto err_dl_port_unreg; 1305 1305 1306 - devlink_set_features(dl, DEVLINK_F_RELOAD); 1307 1306 out: 1308 1307 devlink_register(dl); 1309 1308 return 0;
-1
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_devlink.c
··· 114 114 priv->hdev = hdev; 115 115 hdev->devlink = devlink; 116 116 117 - devlink_set_features(devlink, DEVLINK_F_RELOAD); 118 117 devlink_register(devlink); 119 118 return 0; 120 119 }
-1
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_devlink.c
··· 116 116 priv->hdev = hdev; 117 117 hdev->devlink = devlink; 118 118 119 - devlink_set_features(devlink, DEVLINK_F_RELOAD); 120 119 devlink_register(devlink); 121 120 return 0; 122 121 }
-1
drivers/net/ethernet/intel/ice/ice_devlink.c
··· 1376 1376 { 1377 1377 struct devlink *devlink = priv_to_devlink(pf); 1378 1378 1379 - devlink_set_features(devlink, DEVLINK_F_RELOAD); 1380 1379 devlink_register(devlink); 1381 1380 } 1382 1381
-1
drivers/net/ethernet/mellanox/mlx4/main.c
··· 4031 4031 goto err_params_unregister; 4032 4032 4033 4033 pci_save_state(pdev); 4034 - devlink_set_features(devlink, DEVLINK_F_RELOAD); 4035 4034 devl_unlock(devlink); 4036 4035 devlink_register(devlink); 4037 4036 return 0;
+5 -4
drivers/net/ethernet/mellanox/mlx5/core/devlink.c
··· 156 156 return -EOPNOTSUPP; 157 157 } 158 158 159 + if (mlx5_core_is_mp_slave(dev)) { 160 + NL_SET_ERR_MSG_MOD(extack, "reload is unsupported for multi port slave"); 161 + return -EOPNOTSUPP; 162 + } 163 + 159 164 if (pci_num_vf(pdev)) { 160 165 NL_SET_ERR_MSG_MOD(extack, "reload while VFs are present is unfavorable"); 161 166 } ··· 749 744 750 745 int mlx5_devlink_params_register(struct devlink *devlink) 751 746 { 752 - struct mlx5_core_dev *dev = devlink_priv(devlink); 753 747 int err; 754 748 755 749 err = devl_params_register(devlink, mlx5_devlink_params, ··· 765 761 err = mlx5_devlink_max_uc_list_params_register(devlink); 766 762 if (err) 767 763 goto max_uc_list_err; 768 - 769 - if (!mlx5_core_is_mp_slave(dev)) 770 - devlink_set_features(devlink, DEVLINK_F_RELOAD); 771 764 772 765 return 0; 773 766
-1
drivers/net/ethernet/mellanox/mlxsw/core.c
··· 2285 2285 } 2286 2286 2287 2287 if (!reload) { 2288 - devlink_set_features(devlink, DEVLINK_F_RELOAD); 2289 2288 devl_unlock(devlink); 2290 2289 devlink_register(devlink); 2291 2290 }
-1
drivers/net/netdevsim/dev.c
··· 1609 1609 goto err_hwstats_exit; 1610 1610 1611 1611 nsim_dev->esw_mode = DEVLINK_ESWITCH_MODE_LEGACY; 1612 - devlink_set_features(devlink, DEVLINK_F_RELOAD); 1613 1612 devl_unlock(devlink); 1614 1613 return 0; 1615 1614
+1 -1
include/net/devlink.h
··· 1645 1645 { 1646 1646 return devlink_alloc_ns(ops, priv_size, &init_net, dev); 1647 1647 } 1648 - void devlink_set_features(struct devlink *devlink, u64 features); 1648 + 1649 1649 int devl_register(struct devlink *devlink); 1650 1650 void devl_unregister(struct devlink *devlink); 1651 1651 void devlink_register(struct devlink *devlink);
-19
net/devlink/core.c
··· 126 126 } 127 127 128 128 /** 129 - * devlink_set_features - Set devlink supported features 130 - * 131 - * @devlink: devlink 132 - * @features: devlink support features 133 - * 134 - * This interface allows us to set reload ops separatelly from 135 - * the devlink_alloc. 136 - */ 137 - void devlink_set_features(struct devlink *devlink, u64 features) 138 - { 139 - WARN_ON(features & DEVLINK_F_RELOAD && 140 - !devlink_reload_supported(devlink->ops)); 141 - devlink->features = features; 142 - } 143 - EXPORT_SYMBOL_GPL(devlink_set_features); 144 - 145 - /** 146 129 * devl_register - Register devlink instance 147 130 * @devlink: devlink 148 131 */ ··· 286 303 * all devlink instances from this namespace into init_net. 287 304 */ 288 305 devlinks_xa_for_each_registered_get(net, index, devlink) { 289 - WARN_ON(!(devlink->features & DEVLINK_F_RELOAD)); 290 306 devl_lock(devlink); 291 307 err = 0; 292 308 if (devl_is_registered(devlink)) ··· 295 313 &actions_performed, NULL); 296 314 devl_unlock(devlink); 297 315 devlink_put(devlink); 298 - 299 316 if (err && err != -EOPNOTSUPP) 300 317 pr_warn("Failed to reload devlink instance into init_net\n"); 301 318 }
-1
net/devlink/devl_internal.h
··· 38 38 struct list_head trap_policer_list; 39 39 struct list_head linecard_list; 40 40 const struct devlink_ops *ops; 41 - u64 features; 42 41 struct xarray snapshot_ids; 43 42 struct devlink_dev_stats stats; 44 43 struct device *dev;
+11 -35
net/devlink/leftover.c
··· 4230 4230 return net; 4231 4231 } 4232 4232 4233 - static void devlink_param_notify(struct devlink *devlink, 4234 - unsigned int port_index, 4235 - struct devlink_param_item *param_item, 4236 - enum devlink_command cmd); 4237 - 4238 - static void devlink_ns_change_notify(struct devlink *devlink, 4239 - struct net *dest_net, struct net *curr_net, 4240 - bool new) 4233 + static void devlink_reload_netns_change(struct devlink *devlink, 4234 + struct net *curr_net, 4235 + struct net *dest_net) 4241 4236 { 4242 - struct devlink_param_item *param_item; 4243 - enum devlink_command cmd; 4244 - 4245 4237 /* Userspace needs to be notified about devlink objects 4246 4238 * removed from original and entering new network namespace. 4247 4239 * The rest of the devlink objects are re-created during 4248 4240 * reload process so the notifications are generated separatelly. 4249 4241 */ 4250 - 4251 - if (!dest_net || net_eq(dest_net, curr_net)) 4252 - return; 4253 - 4254 - if (new) 4255 - devlink_notify(devlink, DEVLINK_CMD_NEW); 4256 - 4257 - cmd = new ? DEVLINK_CMD_PARAM_NEW : DEVLINK_CMD_PARAM_DEL; 4258 - list_for_each_entry(param_item, &devlink->param_list, list) 4259 - devlink_param_notify(devlink, 0, param_item, cmd); 4260 - 4261 - if (!new) 4262 - devlink_notify(devlink, DEVLINK_CMD_DEL); 4242 + devlink_notify_unregister(devlink); 4243 + move_netdevice_notifier_net(curr_net, dest_net, 4244 + &devlink->netdevice_nb); 4245 + write_pnet(&devlink->_net, dest_net); 4246 + devlink_notify_register(devlink); 4263 4247 } 4264 4248 4265 4249 static void devlink_reload_failed_set(struct devlink *devlink, ··· 4325 4341 memcpy(remote_reload_stats, devlink->stats.remote_reload_stats, 4326 4342 sizeof(remote_reload_stats)); 4327 4343 4328 - curr_net = devlink_net(devlink); 4329 - devlink_ns_change_notify(devlink, dest_net, curr_net, false); 4330 4344 err = devlink->ops->reload_down(devlink, !!dest_net, action, limit, extack); 4331 4345 if (err) 4332 4346 return err; 4333 4347 4334 - if (dest_net && !net_eq(dest_net, curr_net)) { 4335 - move_netdevice_notifier_net(curr_net, dest_net, 4336 - &devlink->netdevice_nb); 4337 - write_pnet(&devlink->_net, dest_net); 4338 - } 4348 + curr_net = devlink_net(devlink); 4349 + if (dest_net && !net_eq(dest_net, curr_net)) 4350 + devlink_reload_netns_change(devlink, curr_net, dest_net); 4339 4351 4340 4352 err = devlink->ops->reload_up(devlink, action, limit, actions_performed, extack); 4341 4353 devlink_reload_failed_set(devlink, !!err); 4342 4354 if (err) 4343 4355 return err; 4344 4356 4345 - devlink_ns_change_notify(devlink, dest_net, curr_net, true); 4346 4357 WARN_ON(!(*actions_performed & BIT(action))); 4347 4358 /* Catch driver on updating the remote action within devlink reload */ 4348 4359 WARN_ON(memcmp(remote_reload_stats, devlink->stats.remote_reload_stats, ··· 4386 4407 struct net *dest_net = NULL; 4387 4408 u32 actions_performed; 4388 4409 int err; 4389 - 4390 - if (!(devlink->features & DEVLINK_F_RELOAD)) 4391 - return -EOPNOTSUPP; 4392 4410 4393 4411 err = devlink_resources_validate(devlink, NULL, info); 4394 4412 if (err) {