net/mlx5: Fix mlx5_core_destroy_cq() error flow
authorYishai Hadas <yishaih@mellanox.com>
Sun, 30 Jun 2019 16:23:22 +0000 (19:23 +0300)
committerLeon Romanovsky <leonro@mellanox.com>
Wed, 3 Jul 2019 17:54:57 +0000 (20:54 +0300)
The firmware command to destroy a CQ might fail when the object is
referenced by other object and the ref count is managed by the firmware.

To enable a second successful destruction post the first failure need to
change  mlx5_eq_del_cq() to be a void function.

As an error in mlx5_eq_del_cq() is quite fatal from the option to
recover, a debug message inside it should be good enougth and it was
changed to be void.

Signed-off-by: Yishai Hadas <yishaih@mellanox.com>
Acked-by: Saeed Mahameed <saeedm@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/cq.c
drivers/net/ethernet/mellanox/mlx5/core/eq.c
drivers/net/ethernet/mellanox/mlx5/core/lib/eq.h

index 713a17ee37518e8e017d4c35456c439fa5beb004..703d88332bc6f53af44458793d9a2db1d819c4df 100644 (file)
@@ -158,13 +158,8 @@ int mlx5_core_destroy_cq(struct mlx5_core_dev *dev, struct mlx5_core_cq *cq)
        u32 in[MLX5_ST_SZ_DW(destroy_cq_in)] = {0};
        int err;
 
-       err = mlx5_eq_del_cq(mlx5_get_async_eq(dev), cq);
-       if (err)
-               return err;
-
-       err = mlx5_eq_del_cq(&cq->eq->core, cq);
-       if (err)
-               return err;
+       mlx5_eq_del_cq(mlx5_get_async_eq(dev), cq);
+       mlx5_eq_del_cq(&cq->eq->core, cq);
 
        MLX5_SET(destroy_cq_in, in, opcode, MLX5_CMD_OP_DESTROY_CQ);
        MLX5_SET(destroy_cq_in, in, cqn, cq->cqn);
index 58fff2f39b386ce757e85c62e892865fe14be025..8000d2a4a7e217511bd9cd8bc2bf306cee68c6ea 100644 (file)
@@ -389,7 +389,7 @@ int mlx5_eq_add_cq(struct mlx5_eq *eq, struct mlx5_core_cq *cq)
        return err;
 }
 
-int mlx5_eq_del_cq(struct mlx5_eq *eq, struct mlx5_core_cq *cq)
+void mlx5_eq_del_cq(struct mlx5_eq *eq, struct mlx5_core_cq *cq)
 {
        struct mlx5_cq_table *table = &eq->cq_table;
        struct mlx5_core_cq *tmp;
@@ -399,16 +399,14 @@ int mlx5_eq_del_cq(struct mlx5_eq *eq, struct mlx5_core_cq *cq)
        spin_unlock(&table->lock);
 
        if (!tmp) {
-               mlx5_core_warn(eq->dev, "cq 0x%x not found in eq 0x%x tree\n", eq->eqn, cq->cqn);
-               return -ENOENT;
+               mlx5_core_dbg(eq->dev, "cq 0x%x not found in eq 0x%x tree\n",
+                             eq->eqn, cq->cqn);
+               return;
        }
 
-       if (tmp != cq) {
-               mlx5_core_warn(eq->dev, "corruption on cqn 0x%x in eq 0x%x\n", eq->eqn, cq->cqn);
-               return -EINVAL;
-       }
-
-       return 0;
+       if (tmp != cq)
+               mlx5_core_dbg(eq->dev, "corruption on cqn 0x%x in eq 0x%x\n",
+                             eq->eqn, cq->cqn);
 }
 
 int mlx5_eq_table_init(struct mlx5_core_dev *dev)
index 24bd991a727e70ce15c45f197c5277bf73badaf7..d826e63d5a17139540e2aa43e5fbc0a818c1d50c 100644 (file)
@@ -75,7 +75,7 @@ int mlx5_eq_table_create(struct mlx5_core_dev *dev);
 void mlx5_eq_table_destroy(struct mlx5_core_dev *dev);
 
 int mlx5_eq_add_cq(struct mlx5_eq *eq, struct mlx5_core_cq *cq);
-int mlx5_eq_del_cq(struct mlx5_eq *eq, struct mlx5_core_cq *cq);
+void mlx5_eq_del_cq(struct mlx5_eq *eq, struct mlx5_core_cq *cq);
 struct mlx5_eq_comp *mlx5_eqn2comp_eq(struct mlx5_core_dev *dev, int eqn);
 struct mlx5_eq *mlx5_get_async_eq(struct mlx5_core_dev *dev);
 void mlx5_cq_tasklet_cb(unsigned long data);