]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net/mlx5: Disable reload while removing the device
authorParav Pandit <parav@mellanox.com>
Thu, 14 May 2020 10:12:56 +0000 (05:12 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 17 Jun 2020 14:42:02 +0000 (16:42 +0200)
[ Upstream commit 60904cd349abc98cb888fc28d1ca55a8e2cf87b3 ]

While unregistration is in progress, user might be reloading the
interface.
This can race with unregistration in below flow which uses the
resources which are getting disabled by reload flow.

Hence, disable the devlink reloading first when removing the device.

     CPU0                                   CPU1
     ----                                   ----
local_pci_remove()                  devlink_mutex
  remove_one()                       devlink_nl_cmd_reload()
    mlx5_unregister_device()           devlink_reload()
                                       ops->reload_down()
                                         mlx5_unload_one()

Fixes: 4383cfcc65e7 ("net/mlx5: Add devlink reload")
Signed-off-by: Parav Pandit <parav@mellanox.com>
Reviewed-by: Moshe Shemesh <moshe@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/ethernet/mellanox/mlx5/core/devlink.c
drivers/net/ethernet/mellanox/mlx5/core/main.c

index 184c3eaefbcb4229a967c974ccfa40c7c37f1598..c190eb267f3caaf3d2d34b37d2bb2b673f11c477 100644 (file)
@@ -256,7 +256,6 @@ int mlx5_devlink_register(struct devlink *devlink, struct device *dev)
                goto params_reg_err;
        mlx5_devlink_set_params_init_values(devlink);
        devlink_params_publish(devlink);
-       devlink_reload_enable(devlink);
        return 0;
 
 params_reg_err:
@@ -266,7 +265,6 @@ params_reg_err:
 
 void mlx5_devlink_unregister(struct devlink *devlink)
 {
-       devlink_reload_disable(devlink);
        devlink_params_unregister(devlink, mlx5_devlink_params,
                                  ARRAY_SIZE(mlx5_devlink_params));
        devlink_unregister(devlink);
index d7986f64494be14c1d883ddbdedac17b2ca2454e..743491babf8880246ebb26c4c296aed2cfe571d1 100644 (file)
@@ -1371,6 +1371,7 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *id)
                dev_err(&pdev->dev, "mlx5_crdump_enable failed with error code %d\n", err);
 
        pci_save_state(pdev);
+       devlink_reload_enable(devlink);
        return 0;
 
 err_load_one:
@@ -1388,6 +1389,7 @@ 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);
        mlx5_crdump_disable(dev);
        mlx5_devlink_unregister(devlink);