net/mlx5: Suspend auxiliary devices only in case of PCI device suspend
authorJiri Pirko <jiri@nvidia.com>
Thu, 26 Jan 2023 12:39:09 +0000 (13:39 +0100)
committerSaeed Mahameed <saeedm@nvidia.com>
Tue, 14 Feb 2023 22:08:27 +0000 (14:08 -0800)
The original behavior introduced by commit c6acd629eec7 ("net/mlx5e: Add
support for devlink-port in non-representors mode") correctly
re-instantiated uplink devlink port and related netdevice during devlink
reload. However with migration to auxiliary devices, this behaviour
changed.

Restore the original behaviour and tear down auxiliary devices
completely during devlink reload.

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/dev.c
drivers/net/ethernet/mellanox/mlx5/core/devlink.c
drivers/net/ethernet/mellanox/mlx5/core/fw_reset.c
drivers/net/ethernet/mellanox/mlx5/core/health.c
drivers/net/ethernet/mellanox/mlx5/core/main.c
drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h
drivers/net/ethernet/mellanox/mlx5/core/sf/dev/driver.c

index 49bbfadc8c646d6476a245649b9c93324481c4ca..445fe30c3d0bc5aa149f366408cea2bd9fc23497 100644 (file)
@@ -396,7 +396,7 @@ int mlx5_attach_device(struct mlx5_core_dev *dev)
        return ret;
 }
 
-void mlx5_detach_device(struct mlx5_core_dev *dev)
+void mlx5_detach_device(struct mlx5_core_dev *dev, bool suspend)
 {
        struct mlx5_priv *priv = &dev->priv;
        struct auxiliary_device *adev;
@@ -425,7 +425,7 @@ void mlx5_detach_device(struct mlx5_core_dev *dev)
 
                adrv = to_auxiliary_drv(adev->dev.driver);
 
-               if (adrv->suspend) {
+               if (adrv->suspend && suspend) {
                        adrv->suspend(adev, pm);
                        continue;
                }
index 2d36123cc05ed833e6ebb4f80c54d4649b1290b1..c5d2fdcabd5665e8fd0d58b3d1f908fc91c58492 100644 (file)
@@ -105,7 +105,7 @@ static int mlx5_devlink_reload_fw_activate(struct devlink *devlink, struct netli
        if (err)
                return err;
 
-       mlx5_unload_one_devl_locked(dev);
+       mlx5_unload_one_devl_locked(dev, true);
        err = mlx5_health_wait_pci_up(dev);
        if (err)
                NL_SET_ERR_MSG_MOD(extack, "FW activate aborted, PCI reads fail after reset");
@@ -168,7 +168,7 @@ static int mlx5_devlink_reload_down(struct devlink *devlink, bool netns_change,
 
        switch (action) {
        case DEVLINK_RELOAD_ACTION_DRIVER_REINIT:
-               mlx5_unload_one_devl_locked(dev);
+               mlx5_unload_one_devl_locked(dev, false);
                break;
        case DEVLINK_RELOAD_ACTION_FW_ACTIVATE:
                if (limit == DEVLINK_RELOAD_LIMIT_NO_RESET)
index 7bde34a1716586e6f9eb41d2b69e20a425c7172d..4c2dad9d7cfb8e73f27f92b0b2cba590ebb3075a 100644 (file)
@@ -163,7 +163,7 @@ static void mlx5_fw_reset_complete_reload(struct mlx5_core_dev *dev)
        if (test_bit(MLX5_FW_RESET_FLAGS_PENDING_COMP, &fw_reset->reset_flags)) {
                complete(&fw_reset->done);
        } else {
-               mlx5_unload_one(dev);
+               mlx5_unload_one(dev, false);
                if (mlx5_health_wait_pci_up(dev))
                        mlx5_core_err(dev, "reset reload flow aborted, PCI reads still not working\n");
                else
@@ -498,7 +498,7 @@ int mlx5_fw_reset_wait_reset_done(struct mlx5_core_dev *dev)
        }
        err = fw_reset->ret;
        if (test_and_clear_bit(MLX5_FW_RESET_FLAGS_RELOAD_REQUIRED, &fw_reset->reset_flags)) {
-               mlx5_unload_one_devl_locked(dev);
+               mlx5_unload_one_devl_locked(dev, false);
                mlx5_load_one_devl_locked(dev, false);
        }
 out:
index 1e8bee906c31ce788f86469d7dd08dcf80335ace..f9438d4e43caf095ae363e56bf11416e51a24b9f 100644 (file)
@@ -699,7 +699,7 @@ static void mlx5_fw_fatal_reporter_err_work(struct work_struct *work)
                 * requests from the kernel.
                 */
                mlx5_core_err(dev, "Driver is in error state. Unloading\n");
-               mlx5_unload_one(dev);
+               mlx5_unload_one(dev, false);
        }
 }
 
index 6997b29fdeccb51769a7cf255e600ff7446557af..540840e80493b083e9d784caa40ef78df4b4f731 100644 (file)
@@ -1520,12 +1520,12 @@ int mlx5_load_one(struct mlx5_core_dev *dev)
        return ret;
 }
 
-void mlx5_unload_one_devl_locked(struct mlx5_core_dev *dev)
+void mlx5_unload_one_devl_locked(struct mlx5_core_dev *dev, bool suspend)
 {
        devl_assert_locked(priv_to_devlink(dev));
        mutex_lock(&dev->intf_state_mutex);
 
-       mlx5_detach_device(dev);
+       mlx5_detach_device(dev, suspend);
 
        if (!test_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state)) {
                mlx5_core_warn(dev, "%s: interface is down, NOP\n",
@@ -1540,12 +1540,12 @@ out:
        mutex_unlock(&dev->intf_state_mutex);
 }
 
-void mlx5_unload_one(struct mlx5_core_dev *dev)
+void mlx5_unload_one(struct mlx5_core_dev *dev, bool suspend)
 {
        struct devlink *devlink = priv_to_devlink(dev);
 
        devl_lock(devlink);
-       mlx5_unload_one_devl_locked(dev);
+       mlx5_unload_one_devl_locked(dev, suspend);
        devl_unlock(devlink);
 }
 
@@ -1830,7 +1830,7 @@ static pci_ers_result_t mlx5_pci_err_detected(struct pci_dev *pdev,
 
        mlx5_enter_error_state(dev, false);
        mlx5_error_sw_reset(dev);
-       mlx5_unload_one(dev);
+       mlx5_unload_one(dev, true);
        mlx5_drain_health_wq(dev);
        mlx5_pci_disable_device(dev);
 
@@ -1986,7 +1986,7 @@ static void shutdown(struct pci_dev *pdev)
        set_bit(MLX5_BREAK_FW_WAIT, &dev->intf_state);
        err = mlx5_try_fast_unload(dev);
        if (err)
-               mlx5_unload_one(dev);
+               mlx5_unload_one(dev, false);
        mlx5_pci_disable_device(dev);
 }
 
@@ -1994,7 +1994,7 @@ static int mlx5_suspend(struct pci_dev *pdev, pm_message_t state)
 {
        struct mlx5_core_dev *dev = pci_get_drvdata(pdev);
 
-       mlx5_unload_one(dev);
+       mlx5_unload_one(dev, true);
 
        return 0;
 }
@@ -2037,7 +2037,7 @@ MODULE_DEVICE_TABLE(pci, mlx5_core_pci_table);
 void mlx5_disable_device(struct mlx5_core_dev *dev)
 {
        mlx5_error_sw_reset(dev);
-       mlx5_unload_one_devl_locked(dev);
+       mlx5_unload_one_devl_locked(dev, false);
 }
 
 int mlx5_recover_device(struct mlx5_core_dev *dev)
index d670b28a73236584c7bfc01ac732290ef46d0d68..be0785f83083a13f55e5e3fa6998821774f07fbf 100644 (file)
@@ -236,7 +236,7 @@ void mlx5_adev_cleanup(struct mlx5_core_dev *dev);
 int mlx5_adev_init(struct mlx5_core_dev *dev);
 
 int mlx5_attach_device(struct mlx5_core_dev *dev);
-void mlx5_detach_device(struct mlx5_core_dev *dev);
+void mlx5_detach_device(struct mlx5_core_dev *dev, bool suspend);
 int mlx5_register_device(struct mlx5_core_dev *dev);
 void mlx5_unregister_device(struct mlx5_core_dev *dev);
 struct mlx5_core_dev *mlx5_get_next_phys_dev_lag(struct mlx5_core_dev *dev);
@@ -319,8 +319,8 @@ int mlx5_mdev_init(struct mlx5_core_dev *dev, int profile_idx);
 void mlx5_mdev_uninit(struct mlx5_core_dev *dev);
 int mlx5_init_one(struct mlx5_core_dev *dev);
 void mlx5_uninit_one(struct mlx5_core_dev *dev);
-void mlx5_unload_one(struct mlx5_core_dev *dev);
-void mlx5_unload_one_devl_locked(struct mlx5_core_dev *dev);
+void mlx5_unload_one(struct mlx5_core_dev *dev, bool suspend);
+void mlx5_unload_one_devl_locked(struct mlx5_core_dev *dev, bool suspend);
 int mlx5_load_one(struct mlx5_core_dev *dev);
 int mlx5_load_one_devl_locked(struct mlx5_core_dev *dev, bool recovery);
 
index 7b4783ce213e2d6b0f08de2b2eb575117baafda9..a7377619ba6f2943b8a184a733e1756e5fcc278b 100644 (file)
@@ -74,7 +74,7 @@ static void mlx5_sf_dev_shutdown(struct auxiliary_device *adev)
 {
        struct mlx5_sf_dev *sf_dev = container_of(adev, struct mlx5_sf_dev, adev);
 
-       mlx5_unload_one(sf_dev->mdev);
+       mlx5_unload_one(sf_dev->mdev, false);
 }
 
 static const struct auxiliary_device_id mlx5_sf_dev_id_table[] = {