devlink: Delete reload enable/disable interface
Commit a0c76345e3
("devlink: disallow reload operation during device
cleanup") added devlink_reload_{enable,disable}() APIs to prevent reload
operation from racing with device probe/dismantle.
After recent changes to move devlink_register() to the end of device
probe and devlink_unregister() to the beginning of device dismantle,
these races can no longer happen. Reload operations will be denied if
the devlink instance is unregistered and devlink_unregister() will block
until all in-flight operations are done.
Therefore, remove these devlink_reload_{enable,disable}() APIs.
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
96869f193c
commit
82465bec3e
@ -121,7 +121,6 @@ int hclge_devlink_init(struct hclge_dev *hdev)
|
||||
|
||||
devlink_set_features(devlink, DEVLINK_F_RELOAD);
|
||||
devlink_register(devlink);
|
||||
devlink_reload_enable(devlink);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -129,8 +128,6 @@ void hclge_devlink_uninit(struct hclge_dev *hdev)
|
||||
{
|
||||
struct devlink *devlink = hdev->devlink;
|
||||
|
||||
devlink_reload_disable(devlink);
|
||||
|
||||
devlink_unregister(devlink);
|
||||
|
||||
devlink_free(devlink);
|
||||
|
@ -123,7 +123,6 @@ int hclgevf_devlink_init(struct hclgevf_dev *hdev)
|
||||
|
||||
devlink_set_features(devlink, DEVLINK_F_RELOAD);
|
||||
devlink_register(devlink);
|
||||
devlink_reload_enable(devlink);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -131,8 +130,6 @@ void hclgevf_devlink_uninit(struct hclgevf_dev *hdev)
|
||||
{
|
||||
struct devlink *devlink = hdev->devlink;
|
||||
|
||||
devlink_reload_disable(devlink);
|
||||
|
||||
devlink_unregister(devlink);
|
||||
|
||||
devlink_free(devlink);
|
||||
|
@ -4027,7 +4027,6 @@ static int mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
pci_save_state(pdev);
|
||||
devlink_set_features(devlink, DEVLINK_F_RELOAD);
|
||||
devlink_register(devlink);
|
||||
devlink_reload_enable(devlink);
|
||||
return 0;
|
||||
|
||||
err_params_unregister:
|
||||
@ -4136,7 +4135,6 @@ static void mlx4_remove_one(struct pci_dev *pdev)
|
||||
struct devlink *devlink = priv_to_devlink(priv);
|
||||
int active_vfs = 0;
|
||||
|
||||
devlink_reload_disable(devlink);
|
||||
devlink_unregister(devlink);
|
||||
|
||||
if (mlx4_is_slave(dev))
|
||||
|
@ -1538,8 +1538,6 @@ static int probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
|
||||
pci_save_state(pdev);
|
||||
devlink_register(devlink);
|
||||
if (!mlx5_core_is_mp_slave(dev))
|
||||
devlink_reload_enable(devlink);
|
||||
return 0;
|
||||
|
||||
err_init_one:
|
||||
@ -1559,7 +1557,6 @@ static void remove_one(struct pci_dev *pdev)
|
||||
struct mlx5_core_dev *dev = pci_get_drvdata(pdev);
|
||||
struct devlink *devlink = priv_to_devlink(dev);
|
||||
|
||||
devlink_reload_disable(devlink);
|
||||
devlink_unregister(devlink);
|
||||
mlx5_crdump_disable(dev);
|
||||
mlx5_drain_health_wq(dev);
|
||||
|
@ -47,7 +47,6 @@ static int mlx5_sf_dev_probe(struct auxiliary_device *adev, const struct auxilia
|
||||
goto init_one_err;
|
||||
}
|
||||
devlink_register(devlink);
|
||||
devlink_reload_enable(devlink);
|
||||
return 0;
|
||||
|
||||
init_one_err:
|
||||
@ -62,10 +61,8 @@ mdev_err:
|
||||
static void mlx5_sf_dev_remove(struct auxiliary_device *adev)
|
||||
{
|
||||
struct mlx5_sf_dev *sf_dev = container_of(adev, struct mlx5_sf_dev, adev);
|
||||
struct devlink *devlink;
|
||||
struct devlink *devlink = priv_to_devlink(sf_dev->mdev);
|
||||
|
||||
devlink = priv_to_devlink(sf_dev->mdev);
|
||||
devlink_reload_disable(devlink);
|
||||
devlink_unregister(devlink);
|
||||
mlx5_uninit_one(sf_dev->mdev);
|
||||
iounmap(sf_dev->mdev->iseg);
|
||||
|
@ -2010,9 +2010,7 @@ __mlxsw_core_bus_device_register(const struct mlxsw_bus_info *mlxsw_bus_info,
|
||||
if (!reload) {
|
||||
devlink_set_features(devlink, DEVLINK_F_RELOAD);
|
||||
devlink_register(devlink);
|
||||
devlink_reload_enable(devlink);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_driver_init:
|
||||
@ -2076,10 +2074,9 @@ void mlxsw_core_bus_device_unregister(struct mlxsw_core *mlxsw_core,
|
||||
{
|
||||
struct devlink *devlink = priv_to_devlink(mlxsw_core);
|
||||
|
||||
if (!reload) {
|
||||
devlink_reload_disable(devlink);
|
||||
if (!reload)
|
||||
devlink_unregister(devlink);
|
||||
}
|
||||
|
||||
if (devlink_is_reload_failed(devlink)) {
|
||||
if (!reload)
|
||||
/* Only the parts that were not de-initialized in the
|
||||
|
@ -1513,7 +1513,6 @@ int nsim_dev_probe(struct nsim_bus_dev *nsim_bus_dev)
|
||||
nsim_dev->esw_mode = DEVLINK_ESWITCH_MODE_LEGACY;
|
||||
devlink_set_features(devlink, DEVLINK_F_RELOAD);
|
||||
devlink_register(devlink);
|
||||
devlink_reload_enable(devlink);
|
||||
return 0;
|
||||
|
||||
err_psample_exit:
|
||||
@ -1567,9 +1566,7 @@ void nsim_dev_remove(struct nsim_bus_dev *nsim_bus_dev)
|
||||
struct nsim_dev *nsim_dev = dev_get_drvdata(&nsim_bus_dev->dev);
|
||||
struct devlink *devlink = priv_to_devlink(nsim_dev);
|
||||
|
||||
devlink_reload_disable(devlink);
|
||||
devlink_unregister(devlink);
|
||||
|
||||
nsim_dev_reload_destroy(nsim_dev);
|
||||
|
||||
nsim_bpf_dev_exit(nsim_dev);
|
||||
|
@ -1511,8 +1511,6 @@ static inline struct devlink *devlink_alloc(const struct devlink_ops *ops,
|
||||
void devlink_set_features(struct devlink *devlink, u64 features);
|
||||
void devlink_register(struct devlink *devlink);
|
||||
void devlink_unregister(struct devlink *devlink);
|
||||
void devlink_reload_enable(struct devlink *devlink);
|
||||
void devlink_reload_disable(struct devlink *devlink);
|
||||
void devlink_free(struct devlink *devlink);
|
||||
int devlink_port_register(struct devlink *devlink,
|
||||
struct devlink_port *devlink_port,
|
||||
|
@ -63,8 +63,7 @@ struct devlink {
|
||||
* port, sb, dpipe, resource, params, region, traps and more.
|
||||
*/
|
||||
struct mutex lock;
|
||||
u8 reload_failed:1,
|
||||
reload_enabled:1;
|
||||
u8 reload_failed:1;
|
||||
refcount_t refcount;
|
||||
struct completion comp;
|
||||
char priv[0] __aligned(NETDEV_ALIGN);
|
||||
@ -4033,9 +4032,6 @@ static int devlink_reload(struct devlink *devlink, struct net *dest_net,
|
||||
struct net *curr_net;
|
||||
int err;
|
||||
|
||||
if (!devlink->reload_enabled || !(devlink->features & DEVLINK_F_RELOAD))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
memcpy(remote_reload_stats, devlink->stats.remote_reload_stats,
|
||||
sizeof(remote_reload_stats));
|
||||
|
||||
@ -4103,7 +4099,7 @@ static int devlink_nl_cmd_reload(struct sk_buff *skb, struct genl_info *info)
|
||||
u32 actions_performed;
|
||||
int err;
|
||||
|
||||
if (!devlink_reload_supported(devlink->ops))
|
||||
if (!(devlink->features & DEVLINK_F_RELOAD))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
err = devlink_resources_validate(devlink, NULL, info);
|
||||
@ -9175,49 +9171,12 @@ void devlink_unregister(struct devlink *devlink)
|
||||
wait_for_completion(&devlink->comp);
|
||||
|
||||
mutex_lock(&devlink_mutex);
|
||||
WARN_ON(devlink->features & DEVLINK_F_RELOAD &&
|
||||
devlink->reload_enabled);
|
||||
devlink_notify_unregister(devlink);
|
||||
xa_clear_mark(&devlinks, devlink->index, DEVLINK_REGISTERED);
|
||||
mutex_unlock(&devlink_mutex);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devlink_unregister);
|
||||
|
||||
/**
|
||||
* devlink_reload_enable - Enable reload of devlink instance
|
||||
*
|
||||
* @devlink: devlink
|
||||
*
|
||||
* Should be called at end of device initialization
|
||||
* process when reload operation is supported.
|
||||
*/
|
||||
void devlink_reload_enable(struct devlink *devlink)
|
||||
{
|
||||
mutex_lock(&devlink_mutex);
|
||||
devlink->reload_enabled = true;
|
||||
mutex_unlock(&devlink_mutex);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devlink_reload_enable);
|
||||
|
||||
/**
|
||||
* devlink_reload_disable - Disable reload of devlink instance
|
||||
*
|
||||
* @devlink: devlink
|
||||
*
|
||||
* Should be called at the beginning of device cleanup
|
||||
* process when reload operation is supported.
|
||||
*/
|
||||
void devlink_reload_disable(struct devlink *devlink)
|
||||
{
|
||||
mutex_lock(&devlink_mutex);
|
||||
/* Mutex is taken which ensures that no reload operation is in
|
||||
* progress while setting up forbidded flag.
|
||||
*/
|
||||
devlink->reload_enabled = false;
|
||||
mutex_unlock(&devlink_mutex);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devlink_reload_disable);
|
||||
|
||||
/**
|
||||
* devlink_free - Free devlink instance resources
|
||||
*
|
||||
@ -11554,7 +11513,7 @@ static void __net_exit devlink_pernet_pre_exit(struct net *net)
|
||||
if (!net_eq(devlink_net(devlink), net))
|
||||
goto retry;
|
||||
|
||||
WARN_ON(!devlink_reload_supported(devlink->ops));
|
||||
WARN_ON(!(devlink->features & DEVLINK_F_RELOAD));
|
||||
err = devlink_reload(devlink, &init_net,
|
||||
DEVLINK_RELOAD_ACTION_DRIVER_REINIT,
|
||||
DEVLINK_RELOAD_LIMIT_UNSPEC,
|
||||
|
Loading…
Reference in New Issue
Block a user