]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
RDMA/hns: Fix unmatch exception handling when init eq table fails
authorJunxian Huang <huangjunxian6@hisilicon.com>
Wed, 10 Jul 2024 13:37:00 +0000 (21:37 +0800)
committerLeon Romanovsky <leon@kernel.org>
Thu, 11 Jul 2024 10:25:11 +0000 (13:25 +0300)
The hw ctx should be destroyed when init eq table fails.

Fixes: a5073d6054f7 ("RDMA/hns: Add eq support of hip08")
Signed-off-by: Junxian Huang <huangjunxian6@hisilicon.com>
Link: https://lore.kernel.org/r/20240710133705.896445-4-huangjunxian6@hisilicon.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/hw/hns/hns_roce_hw_v2.c

index 2f16554c96befdad377186cc4334be37cb5f2180..cbbc142afc1be5e123edc600124df935484bbfc2 100644 (file)
@@ -6368,9 +6368,16 @@ static void hns_roce_v2_int_mask_enable(struct hns_roce_dev *hr_dev,
        roce_write(hr_dev, ROCEE_VF_ABN_INT_CFG_REG, enable_flag);
 }
 
-static void hns_roce_v2_destroy_eqc(struct hns_roce_dev *hr_dev, u32 eqn)
+static void free_eq_buf(struct hns_roce_dev *hr_dev, struct hns_roce_eq *eq)
+{
+       hns_roce_mtr_destroy(hr_dev, &eq->mtr);
+}
+
+static void hns_roce_v2_destroy_eqc(struct hns_roce_dev *hr_dev,
+                                   struct hns_roce_eq *eq)
 {
        struct device *dev = hr_dev->dev;
+       int eqn = eq->eqn;
        int ret;
        u8 cmd;
 
@@ -6381,12 +6388,9 @@ static void hns_roce_v2_destroy_eqc(struct hns_roce_dev *hr_dev, u32 eqn)
 
        ret = hns_roce_destroy_hw_ctx(hr_dev, cmd, eqn & HNS_ROCE_V2_EQN_M);
        if (ret)
-               dev_err(dev, "[mailbox cmd] destroy eqc(%u) failed.\n", eqn);
-}
+               dev_err(dev, "[mailbox cmd] destroy eqc(%d) failed.\n", eqn);
 
-static void free_eq_buf(struct hns_roce_dev *hr_dev, struct hns_roce_eq *eq)
-{
-       hns_roce_mtr_destroy(hr_dev, &eq->mtr);
+       free_eq_buf(hr_dev, eq);
 }
 
 static void init_eq_config(struct hns_roce_dev *hr_dev, struct hns_roce_eq *eq)
@@ -6733,7 +6737,7 @@ err_request_irq_fail:
 
 err_create_eq_fail:
        for (i -= 1; i >= 0; i--)
-               free_eq_buf(hr_dev, &eq_table->eq[i]);
+               hns_roce_v2_destroy_eqc(hr_dev, &eq_table->eq[i]);
        kfree(eq_table->eq);
 
        return ret;
@@ -6753,11 +6757,8 @@ static void hns_roce_v2_cleanup_eq_table(struct hns_roce_dev *hr_dev)
        __hns_roce_free_irq(hr_dev);
        destroy_workqueue(hr_dev->irq_workq);
 
-       for (i = 0; i < eq_num; i++) {
-               hns_roce_v2_destroy_eqc(hr_dev, i);
-
-               free_eq_buf(hr_dev, &eq_table->eq[i]);
-       }
+       for (i = 0; i < eq_num; i++)
+               hns_roce_v2_destroy_eqc(hr_dev, &eq_table->eq[i]);
 
        kfree(eq_table->eq);
 }