Commit fe324903 authored by Chengchang Tang's avatar Chengchang Tang Committed by Xinghai Cen
Browse files

RDMA/hns: Fix insufficient extend DB for VFs.

mainline inclusion
from mainline-v6.10-rc7
commit 0b8e658f70ffd5dc7cda3872fd524d657d4796b7
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/IADZY7
CVE: NA

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



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

VFs and its PF will share the memory of the extend DB. Currently,
the number of extend DB allocated by driver is only enough for PF.
This leads to a probability of DB loss and some other problems in
scenarios where both PF and VFs use a large number of QPs.

Fixes: 6b63597d ("RDMA/hns: Add TSQ link table support")
Signed-off-by: default avatarChengchang Tang <tangchengchang@huawei.com>
Signed-off-by: default avatarJunxian Huang <huangjunxian6@hisilicon.com>
Link: https://lore.kernel.org/r/20240710133705.896445-8-huangjunxian6@hisilicon.com


Signed-off-by: default avatarLeon Romanovsky <leon@kernel.org>
Signed-off-by: default avatarXinghai Cen <cenxinghai@h-partners.com>
parent b46b2c3e
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -2805,14 +2805,16 @@ static int set_llm_cfg_to_hw(struct hns_roce_dev *hr_dev,
static struct hns_roce_link_table *
alloc_link_table_buf(struct hns_roce_dev *hr_dev)
{
	u16 total_sl = hr_dev->caps.sl_num * hr_dev->func_num;
	struct hns_roce_v2_priv *priv = hr_dev->priv;
	struct hns_roce_link_table *link_tbl;
	u32 pg_shift, size, min_size;

	link_tbl = &priv->ext_llm;
	pg_shift = hr_dev->caps.llm_buf_pg_sz + PAGE_SHIFT;
	size = hr_dev->caps.num_qps * HNS_ROCE_V2_EXT_LLM_ENTRY_SZ;
	min_size = HNS_ROCE_EXT_LLM_MIN_PAGES(hr_dev->caps.sl_num) << pg_shift;
	size = hr_dev->caps.num_qps * hr_dev->func_num *
	       HNS_ROCE_V2_EXT_LLM_ENTRY_SZ;
	min_size = HNS_ROCE_EXT_LLM_MIN_PAGES(total_sl) << pg_shift;

	/* Alloc data table */
	size = max(size, min_size);