]> www.infradead.org Git - users/hch/xfs.git/commitdiff
net/mlx5: Stop waiting for PCI if pci channel is offline
authorMoshe Shemesh <moshe@nvidia.com>
Mon, 3 Jun 2024 21:04:42 +0000 (00:04 +0300)
committerDavid S. Miller <davem@davemloft.net>
Wed, 5 Jun 2024 13:07:16 +0000 (14:07 +0100)
In case pci channel becomes offline the driver should not wait for PCI
reads during health dump and recovery flow. The driver has timeout for
each of these loops trying to read PCI, so it would fail anyway.
However, in case of recovery waiting till timeout may cause the pci
error_detected() callback fail to meet pci_dpc_recovered() wait timeout.

Fixes: b3bd076f7501 ("net/mlx5: Report devlink health on FW fatal issues")
Signed-off-by: Moshe Shemesh <moshe@nvidia.com>
Reviewed-by: Shay Drori <shayd@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlx5/core/fw.c
drivers/net/ethernet/mellanox/mlx5/core/health.c
drivers/net/ethernet/mellanox/mlx5/core/lib/pci_vsc.c

index 2d95a9b7b44e197f67a0a6c2e6c3a1c15379a7bb..b61b7d96611413deda2c987282326d84a019531c 100644 (file)
@@ -373,6 +373,10 @@ int mlx5_cmd_fast_teardown_hca(struct mlx5_core_dev *dev)
        do {
                if (mlx5_get_nic_state(dev) == MLX5_INITIAL_SEG_NIC_INTERFACE_DISABLED)
                        break;
+               if (pci_channel_offline(dev->pdev)) {
+                       mlx5_core_err(dev, "PCI channel offline, stop waiting for NIC IFC\n");
+                       return -EACCES;
+               }
 
                cond_resched();
        } while (!time_after(jiffies, end));
index ad38e31822df10bbf72ab9a3416bc7143efb6b63..a6329ca2d9bffbda0b5a69b4973f061144a9fa67 100644 (file)
@@ -248,6 +248,10 @@ recover_from_sw_reset:
        do {
                if (mlx5_get_nic_state(dev) == MLX5_INITIAL_SEG_NIC_INTERFACE_DISABLED)
                        break;
+               if (pci_channel_offline(dev->pdev)) {
+                       mlx5_core_err(dev, "PCI channel offline, stop waiting for NIC IFC\n");
+                       goto unlock;
+               }
 
                msleep(20);
        } while (!time_after(jiffies, end));
@@ -317,6 +321,10 @@ int mlx5_health_wait_pci_up(struct mlx5_core_dev *dev)
                        mlx5_core_warn(dev, "device is being removed, stop waiting for PCI\n");
                        return -ENODEV;
                }
+               if (pci_channel_offline(dev->pdev)) {
+                       mlx5_core_err(dev, "PCI channel offline, stop waiting for PCI\n");
+                       return -EACCES;
+               }
                msleep(100);
        }
        return 0;
index 6b774e0c2766594250271a2931b77b4540e7ba7c..d0b595ba611014bbfe16712506daf035a012fd7e 100644 (file)
@@ -74,6 +74,10 @@ int mlx5_vsc_gw_lock(struct mlx5_core_dev *dev)
                        ret = -EBUSY;
                        goto pci_unlock;
                }
+               if (pci_channel_offline(dev->pdev)) {
+                       ret = -EACCES;
+                       goto pci_unlock;
+               }
 
                /* Check if semaphore is already locked */
                ret = vsc_read(dev, VSC_SEMAPHORE_OFFSET, &lock_val);