]> git.itanic.dy.fi Git - linux-stable/commitdiff
net/mlx5: DR, Check device state when polling CQ
authorYevgeny Kliteynik <kliteyn@nvidia.com>
Sun, 24 Jul 2022 22:11:19 +0000 (01:11 +0300)
committerSaeed Mahameed <saeedm@nvidia.com>
Thu, 27 Oct 2022 14:50:37 +0000 (15:50 +0100)
Calling fast teardown as part of the normal unloading caused
a problem with SW steering - SW steering still needs to clear
its tables, write to ICM and poll for completions.
When teardown has been done, SW steering keeps polling the CQ
forever, because nobody flushes it.

This patch fixes the issue by checking the device state in
cases where no CQE was returned.

Signed-off-by: Yevgeny Kliteynik <kliteyn@nvidia.com>
Reviewed-by: Alex Vesker <valex@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_send.c

index ef19a66f523357c6834e8eefadece90a8920ed9c..6ad026123b161657fb3e6f40ce01aeee4fff400a 100644 (file)
@@ -78,8 +78,15 @@ static int dr_cq_poll_one(struct mlx5dr_cq *dr_cq)
        int err;
 
        cqe64 = mlx5_cqwq_get_cqe(&dr_cq->wq);
-       if (!cqe64)
+       if (!cqe64) {
+               if (unlikely(dr_cq->mdev->state ==
+                            MLX5_DEVICE_STATE_INTERNAL_ERROR)) {
+                       mlx5_core_dbg_once(dr_cq->mdev,
+                                          "Polling CQ while device is shutting down\n");
+                       return CQ_POLL_ERR;
+               }
                return CQ_EMPTY;
+       }
 
        mlx5_cqwq_pop(&dr_cq->wq);
        err = dr_parse_cqe(dr_cq, cqe64);
@@ -833,6 +840,7 @@ static struct mlx5dr_cq *dr_create_cq(struct mlx5_core_dev *mdev,
 
        cq->mcq.vector = 0;
        cq->mcq.uar = uar;
+       cq->mdev = mdev;
 
        return cq;