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

devlink: remove devlink features

Devlink features were introduced to disallow devlink reload calls of
userspace before the devlink was fully initialized. The reason for this
workaround was the fact that devlink reload was originally called
without devlink instance lock held.

However, with recent changes that converted devlink reload to be
performed under devlink instance lock, this is redundant so remove
devlink features entirely.

Note that mlx5 used this to enable devlink reload conditionally only
when device didn't act as multi port slave. Move the multi port check
into mlx5_devlink_reload_down() callback alongside with the other
checks preventing the device from reload in certain states.

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Jiri Pirko and committed by
David S. Miller
fb8421a9 a131315a

+6 -35
-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;
-3
net/devlink/leftover.c
··· 4387 4387 u32 actions_performed; 4388 4388 int err; 4389 4389 4390 - if (!(devlink->features & DEVLINK_F_RELOAD)) 4391 - return -EOPNOTSUPP; 4392 - 4393 4390 err = devlink_resources_validate(devlink, NULL, info); 4394 4391 if (err) { 4395 4392 NL_SET_ERR_MSG_MOD(info->extack, "resources size validation failed");