net/mlx5: Add exit route when waiting for FW
authorGavin Li <gavinl@nvidia.com>
Sun, 27 Mar 2022 14:45:32 +0000 (17:45 +0300)
committerSaeed Mahameed <saeedm@nvidia.com>
Tue, 10 May 2022 05:54:00 +0000 (22:54 -0700)
Currently, removing a device needs to get the driver interface lock before
doing any cleanup. If the driver is waiting in a loop for FW init, there
is no way to cancel the wait, instead the device cleanup waits for the
loop to conclude and release the lock.

To allow immediate response to remove device commands, check the TEARDOWN
flag while waiting for FW init, and exit the loop if it has been set.

Signed-off-by: Gavin Li <gavinl@nvidia.com>
Reviewed-by: Moshe Shemesh <moshe@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/main.c
include/linux/mlx5/driver.h

index 35e48ef048452c524ef592213f64b2abc8696f48..f28a3526aafa8714040ba62be2952286cb7e4a15 100644 (file)
@@ -189,7 +189,8 @@ static int wait_fw_init(struct mlx5_core_dev *dev, u32 max_wait_mili,
                fw_initializing = ioread32be(&dev->iseg->initializing);
                if (!(fw_initializing >> 31))
                        break;
-               if (time_after(jiffies, end)) {
+               if (time_after(jiffies, end) ||
+                   test_and_clear_bit(MLX5_BREAK_FW_WAIT, &dev->intf_state)) {
                        err = -EBUSY;
                        break;
                }
@@ -1602,6 +1603,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);
 
+       set_bit(MLX5_BREAK_FW_WAIT, &dev->intf_state);
        devlink_unregister(devlink);
        mlx5_sriov_disable(pdev);
        mlx5_crdump_disable(dev);
@@ -1785,6 +1787,7 @@ static void shutdown(struct pci_dev *pdev)
        int err;
 
        mlx5_core_info(dev, "Shutdown was called\n");
+       set_bit(MLX5_BREAK_FW_WAIT, &dev->intf_state);
        err = mlx5_try_fast_unload(dev);
        if (err)
                mlx5_unload_one(dev);
index ff47d49d8be473f4cd5df8253aeecc16476880b6..f327d05440385603e49bd0f9e77c4247965aa62c 100644 (file)
@@ -632,6 +632,7 @@ enum mlx5_device_state {
 
 enum mlx5_interface_state {
        MLX5_INTERFACE_STATE_UP = BIT(0),
+       MLX5_BREAK_FW_WAIT = BIT(1),
 };
 
 enum mlx5_pci_status {