Commit 82465bec authored by Leon Romanovsky's avatar Leon Romanovsky Committed by Jakub Kicinski

devlink: Delete reload enable/disable interface

Commit a0c76345 ("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: default avatarLeon Romanovsky <leonro@nvidia.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 96869f19
...@@ -121,7 +121,6 @@ int hclge_devlink_init(struct hclge_dev *hdev) ...@@ -121,7 +121,6 @@ int hclge_devlink_init(struct hclge_dev *hdev)
devlink_set_features(devlink, DEVLINK_F_RELOAD); devlink_set_features(devlink, DEVLINK_F_RELOAD);
devlink_register(devlink); devlink_register(devlink);
devlink_reload_enable(devlink);
return 0; return 0;
} }
...@@ -129,8 +128,6 @@ void hclge_devlink_uninit(struct hclge_dev *hdev) ...@@ -129,8 +128,6 @@ void hclge_devlink_uninit(struct hclge_dev *hdev)
{ {
struct devlink *devlink = hdev->devlink; struct devlink *devlink = hdev->devlink;
devlink_reload_disable(devlink);
devlink_unregister(devlink); devlink_unregister(devlink);
devlink_free(devlink); devlink_free(devlink);
......
...@@ -123,7 +123,6 @@ int hclgevf_devlink_init(struct hclgevf_dev *hdev) ...@@ -123,7 +123,6 @@ int hclgevf_devlink_init(struct hclgevf_dev *hdev)
devlink_set_features(devlink, DEVLINK_F_RELOAD); devlink_set_features(devlink, DEVLINK_F_RELOAD);
devlink_register(devlink); devlink_register(devlink);
devlink_reload_enable(devlink);
return 0; return 0;
} }
...@@ -131,8 +130,6 @@ void hclgevf_devlink_uninit(struct hclgevf_dev *hdev) ...@@ -131,8 +130,6 @@ void hclgevf_devlink_uninit(struct hclgevf_dev *hdev)
{ {
struct devlink *devlink = hdev->devlink; struct devlink *devlink = hdev->devlink;
devlink_reload_disable(devlink);
devlink_unregister(devlink); devlink_unregister(devlink);
devlink_free(devlink); devlink_free(devlink);
......
...@@ -4027,7 +4027,6 @@ static int mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -4027,7 +4027,6 @@ static int mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
pci_save_state(pdev); pci_save_state(pdev);
devlink_set_features(devlink, DEVLINK_F_RELOAD); devlink_set_features(devlink, DEVLINK_F_RELOAD);
devlink_register(devlink); devlink_register(devlink);
devlink_reload_enable(devlink);
return 0; return 0;
err_params_unregister: err_params_unregister:
...@@ -4136,7 +4135,6 @@ static void mlx4_remove_one(struct pci_dev *pdev) ...@@ -4136,7 +4135,6 @@ static void mlx4_remove_one(struct pci_dev *pdev)
struct devlink *devlink = priv_to_devlink(priv); struct devlink *devlink = priv_to_devlink(priv);
int active_vfs = 0; int active_vfs = 0;
devlink_reload_disable(devlink);
devlink_unregister(devlink); devlink_unregister(devlink);
if (mlx4_is_slave(dev)) if (mlx4_is_slave(dev))
......
...@@ -1538,8 +1538,6 @@ static int probe_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -1538,8 +1538,6 @@ static int probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
pci_save_state(pdev); pci_save_state(pdev);
devlink_register(devlink); devlink_register(devlink);
if (!mlx5_core_is_mp_slave(dev))
devlink_reload_enable(devlink);
return 0; return 0;
err_init_one: err_init_one:
...@@ -1559,7 +1557,6 @@ static void remove_one(struct pci_dev *pdev) ...@@ -1559,7 +1557,6 @@ static void remove_one(struct pci_dev *pdev)
struct mlx5_core_dev *dev = pci_get_drvdata(pdev); struct mlx5_core_dev *dev = pci_get_drvdata(pdev);
struct devlink *devlink = priv_to_devlink(dev); struct devlink *devlink = priv_to_devlink(dev);
devlink_reload_disable(devlink);
devlink_unregister(devlink); devlink_unregister(devlink);
mlx5_crdump_disable(dev); mlx5_crdump_disable(dev);
mlx5_drain_health_wq(dev); mlx5_drain_health_wq(dev);
......
...@@ -47,7 +47,6 @@ static int mlx5_sf_dev_probe(struct auxiliary_device *adev, const struct auxilia ...@@ -47,7 +47,6 @@ static int mlx5_sf_dev_probe(struct auxiliary_device *adev, const struct auxilia
goto init_one_err; goto init_one_err;
} }
devlink_register(devlink); devlink_register(devlink);
devlink_reload_enable(devlink);
return 0; return 0;
init_one_err: init_one_err:
...@@ -62,10 +61,8 @@ static int mlx5_sf_dev_probe(struct auxiliary_device *adev, const struct auxilia ...@@ -62,10 +61,8 @@ static int mlx5_sf_dev_probe(struct auxiliary_device *adev, const struct auxilia
static void mlx5_sf_dev_remove(struct auxiliary_device *adev) 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 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); devlink_unregister(devlink);
mlx5_uninit_one(sf_dev->mdev); mlx5_uninit_one(sf_dev->mdev);
iounmap(sf_dev->mdev->iseg); iounmap(sf_dev->mdev->iseg);
......
...@@ -2010,9 +2010,7 @@ __mlxsw_core_bus_device_register(const struct mlxsw_bus_info *mlxsw_bus_info, ...@@ -2010,9 +2010,7 @@ __mlxsw_core_bus_device_register(const struct mlxsw_bus_info *mlxsw_bus_info,
if (!reload) { if (!reload) {
devlink_set_features(devlink, DEVLINK_F_RELOAD); devlink_set_features(devlink, DEVLINK_F_RELOAD);
devlink_register(devlink); devlink_register(devlink);
devlink_reload_enable(devlink);
} }
return 0; return 0;
err_driver_init: err_driver_init:
...@@ -2076,10 +2074,9 @@ void mlxsw_core_bus_device_unregister(struct mlxsw_core *mlxsw_core, ...@@ -2076,10 +2074,9 @@ void mlxsw_core_bus_device_unregister(struct mlxsw_core *mlxsw_core,
{ {
struct devlink *devlink = priv_to_devlink(mlxsw_core); struct devlink *devlink = priv_to_devlink(mlxsw_core);
if (!reload) { if (!reload)
devlink_reload_disable(devlink);
devlink_unregister(devlink); devlink_unregister(devlink);
}
if (devlink_is_reload_failed(devlink)) { if (devlink_is_reload_failed(devlink)) {
if (!reload) if (!reload)
/* Only the parts that were not de-initialized in the /* 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) ...@@ -1513,7 +1513,6 @@ int nsim_dev_probe(struct nsim_bus_dev *nsim_bus_dev)
nsim_dev->esw_mode = DEVLINK_ESWITCH_MODE_LEGACY; nsim_dev->esw_mode = DEVLINK_ESWITCH_MODE_LEGACY;
devlink_set_features(devlink, DEVLINK_F_RELOAD); devlink_set_features(devlink, DEVLINK_F_RELOAD);
devlink_register(devlink); devlink_register(devlink);
devlink_reload_enable(devlink);
return 0; return 0;
err_psample_exit: err_psample_exit:
...@@ -1567,9 +1566,7 @@ void nsim_dev_remove(struct nsim_bus_dev *nsim_bus_dev) ...@@ -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 nsim_dev *nsim_dev = dev_get_drvdata(&nsim_bus_dev->dev);
struct devlink *devlink = priv_to_devlink(nsim_dev); struct devlink *devlink = priv_to_devlink(nsim_dev);
devlink_reload_disable(devlink);
devlink_unregister(devlink); devlink_unregister(devlink);
nsim_dev_reload_destroy(nsim_dev); nsim_dev_reload_destroy(nsim_dev);
nsim_bpf_dev_exit(nsim_dev); nsim_bpf_dev_exit(nsim_dev);
......
...@@ -1511,8 +1511,6 @@ static inline struct devlink *devlink_alloc(const struct devlink_ops *ops, ...@@ -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_set_features(struct devlink *devlink, u64 features);
void devlink_register(struct devlink *devlink); void devlink_register(struct devlink *devlink);
void devlink_unregister(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); void devlink_free(struct devlink *devlink);
int devlink_port_register(struct devlink *devlink, int devlink_port_register(struct devlink *devlink,
struct devlink_port *devlink_port, struct devlink_port *devlink_port,
......
...@@ -63,8 +63,7 @@ struct devlink { ...@@ -63,8 +63,7 @@ struct devlink {
* port, sb, dpipe, resource, params, region, traps and more. * port, sb, dpipe, resource, params, region, traps and more.
*/ */
struct mutex lock; struct mutex lock;
u8 reload_failed:1, u8 reload_failed:1;
reload_enabled:1;
refcount_t refcount; refcount_t refcount;
struct completion comp; struct completion comp;
char priv[0] __aligned(NETDEV_ALIGN); char priv[0] __aligned(NETDEV_ALIGN);
...@@ -4033,9 +4032,6 @@ static int devlink_reload(struct devlink *devlink, struct net *dest_net, ...@@ -4033,9 +4032,6 @@ static int devlink_reload(struct devlink *devlink, struct net *dest_net,
struct net *curr_net; struct net *curr_net;
int err; int err;
if (!devlink->reload_enabled || !(devlink->features & DEVLINK_F_RELOAD))
return -EOPNOTSUPP;
memcpy(remote_reload_stats, devlink->stats.remote_reload_stats, memcpy(remote_reload_stats, devlink->stats.remote_reload_stats,
sizeof(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) ...@@ -4103,7 +4099,7 @@ static int devlink_nl_cmd_reload(struct sk_buff *skb, struct genl_info *info)
u32 actions_performed; u32 actions_performed;
int err; int err;
if (!devlink_reload_supported(devlink->ops)) if (!(devlink->features & DEVLINK_F_RELOAD))
return -EOPNOTSUPP; return -EOPNOTSUPP;
err = devlink_resources_validate(devlink, NULL, info); err = devlink_resources_validate(devlink, NULL, info);
...@@ -9175,49 +9171,12 @@ void devlink_unregister(struct devlink *devlink) ...@@ -9175,49 +9171,12 @@ void devlink_unregister(struct devlink *devlink)
wait_for_completion(&devlink->comp); wait_for_completion(&devlink->comp);
mutex_lock(&devlink_mutex); mutex_lock(&devlink_mutex);
WARN_ON(devlink->features & DEVLINK_F_RELOAD &&
devlink->reload_enabled);
devlink_notify_unregister(devlink); devlink_notify_unregister(devlink);
xa_clear_mark(&devlinks, devlink->index, DEVLINK_REGISTERED); xa_clear_mark(&devlinks, devlink->index, DEVLINK_REGISTERED);
mutex_unlock(&devlink_mutex); mutex_unlock(&devlink_mutex);
} }
EXPORT_SYMBOL_GPL(devlink_unregister); 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 * devlink_free - Free devlink instance resources
* *
...@@ -11554,7 +11513,7 @@ static void __net_exit devlink_pernet_pre_exit(struct net *net) ...@@ -11554,7 +11513,7 @@ static void __net_exit devlink_pernet_pre_exit(struct net *net)
if (!net_eq(devlink_net(devlink), net)) if (!net_eq(devlink_net(devlink), net))
goto retry; goto retry;
WARN_ON(!devlink_reload_supported(devlink->ops)); WARN_ON(!(devlink->features & DEVLINK_F_RELOAD));
err = devlink_reload(devlink, &init_net, err = devlink_reload(devlink, &init_net,
DEVLINK_RELOAD_ACTION_DRIVER_REINIT, DEVLINK_RELOAD_ACTION_DRIVER_REINIT,
DEVLINK_RELOAD_LIMIT_UNSPEC, DEVLINK_RELOAD_LIMIT_UNSPEC,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment