devlink: Delete reload enable/disable interface
authorLeon Romanovsky <leonro@nvidia.com>
Tue, 12 Oct 2021 13:15:26 +0000 (16:15 +0300)
committerJakub Kicinski <kuba@kernel.org>
Tue, 12 Oct 2021 23:29:17 +0000 (16:29 -0700)
Commit a0c76345e3d3 ("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>
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_devlink.c
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_devlink.c
drivers/net/ethernet/mellanox/mlx4/main.c
drivers/net/ethernet/mellanox/mlx5/core/main.c
drivers/net/ethernet/mellanox/mlx5/core/sf/dev/driver.c
drivers/net/ethernet/mellanox/mlxsw/core.c
drivers/net/netdevsim/dev.c
include/net/devlink.h
net/core/devlink.c

index 438fe62fea4db693ed4545d0186b8e7b278eea0b..4c441e6a5082dad9028a0551e4abb9d79d462ade 100644 (file)
@@ -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);
index 519f4108422ee56b940a6bdf68e6d19d5010c646..fdc19868b818e282189d7555ce2524e32234d580 100644 (file)
@@ -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);
index 05e850a40b36ae7ba1ae113b490e1daa33bf0018..b187c210d4d66e1249158f58a1a552a04244813a 100644 (file)
@@ -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))
index 5893fdd5aedbfbd6dc8a0a45f27c04ad1cd20432..65313448a47ccfd094df6953cab95d95e3aac054 100644 (file)
@@ -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);
index 3cf272fa21646adcc379c6739bdf6f6ae9bd4d31..7b4783ce213e2d6b0f08de2b2eb575117baafda9 100644 (file)
@@ -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);
index 0f1567149a542b098c1d04097eecdda9f952be1d..3fd3812b8f314e1c44e37d76d3c7d6029b2892b5 100644 (file)
@@ -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
index 520c019dbad59866ae63d8d5f4ff8b74d5d2717b..9661aca357036b13d9f0aed8c7fa03ce2fd8e0da 100644 (file)
@@ -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);
index 287f18b8829372e05098f3b6e32455c4d97e70cc..da3ceeb8b87bf2648764d5e95af6b9067ba2d44e 100644 (file)
@@ -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,
index 1931caa0ce1e724dddc813d5507d4d738341695e..3ce6147a2fe8aaa4f2ad4ec6fd54285ea463d48c 100644 (file)
@@ -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,