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

RDMA/hns: Fix missing pagesize and alignment check in FRMR

mainline inclusion
from mainline-v6.10-rc7
commit d387d4b54eb84208bd4ca13572e106851d0a0819
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=d387d4b54eb84208bd4ca13572e106851d0a0819



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

The offset requires 128B alignment and the page size ranges from
4K to 128M.

Fixes: 68a997c5 ("RDMA/hns: Add FRMR support for hip08")
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-5-huangjunxian6@hisilicon.com


Signed-off-by: default avatarLeon Romanovsky <leon@kernel.org>
Signed-off-by: default avatarXinghai Cen <cenxinghai@h-partners.com>
parent 9e83f449
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -86,6 +86,7 @@
#define MR_TYPE_DMA				0x03

#define HNS_ROCE_FRMR_MAX_PA			512
#define HNS_ROCE_FRMR_ALIGN_SIZE		128

#define PKEY_ID					0xffff
#define NODE_DESC_SIZE				64
@@ -204,6 +205,9 @@ enum {
#define HNS_HW_PAGE_SHIFT			12
#define HNS_HW_PAGE_SIZE			(1 << HNS_HW_PAGE_SHIFT)

#define HNS_HW_MAX_PAGE_SHIFT			27
#define HNS_HW_MAX_PAGE_SIZE			(1 << HNS_HW_MAX_PAGE_SHIFT)

struct hns_roce_uar {
	u64		pfn;
	unsigned long	index;
+5 −0
Original line number Diff line number Diff line
@@ -461,6 +461,11 @@ int hns_roce_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg, int sg_nents,
	struct hns_roce_mtr *mtr = &mr->pbl_mtr;
	int ret, sg_num = 0;

	if (!IS_ALIGNED(*sg_offset, HNS_ROCE_FRMR_ALIGN_SIZE) ||
	    ibmr->page_size < HNS_HW_PAGE_SIZE ||
	    ibmr->page_size > HNS_HW_MAX_PAGE_SIZE)
		return sg_num;

	mr->npages = 0;
	mr->page_list = kvcalloc(mr->pbl_mtr.hem_cfg.buf_pg_count,
				 sizeof(dma_addr_t), GFP_KERNEL);