Commit 9e83f449 authored by Junxian Huang's avatar Junxian Huang Committed by Xinghai Cen
Browse files

RDMA/hns: Fix unmatch exception handling when init eq table fails

mainline inclusion
from mainline-v6.10-rc7
commit 543fb987bd63ed27409b5dea3d3eec27b9c1eac9
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/IAE7TW
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma.git/commit/?id=543fb987bd63ed27409b5dea3d3eec27b9c1eac9



---------------------------------------------------------------------

The hw ctx should be destroyed when init eq table fails.

Fixes: a5073d60 ("RDMA/hns: Add eq support of hip08")
Signed-off-by: default avatarJunxian Huang <huangjunxian6@hisilicon.com>
Link: https://lore.kernel.org/r/20240710133705.896445-4-huangjunxian6@hisilicon.com


Signed-off-by: default avatarLeon Romanovsky <leon@kernel.org>
Signed-off-by: default avatarXinghai Cen <cenxinghai@h-partners.com>
parent 6f7e748b
Loading
Loading
Loading
Loading
+13 −12
Original line number Diff line number Diff line
@@ -6703,9 +6703,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;

@@ -6716,12 +6723,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)
@@ -7066,7 +7070,7 @@ static int hns_roce_v2_init_eq_table(struct hns_roce_dev *hr_dev)

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;
@@ -7086,11 +7090,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);
}