]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
RDMA/hns: Fix missing pagesize and alignment check in FRMR
authorChengchang Tang <tangchengchang@huawei.com>
Wed, 10 Jul 2024 13:37:01 +0000 (21:37 +0800)
committerLeon Romanovsky <leon@kernel.org>
Thu, 11 Jul 2024 10:25:11 +0000 (13:25 +0300)
The offset requires 128B alignment and the page size ranges from
4K to 128M.

Fixes: 68a997c5d28c ("RDMA/hns: Add FRMR support for hip08")
Signed-off-by: Chengchang Tang <tangchengchang@huawei.com>
Signed-off-by: Junxian Huang <huangjunxian6@hisilicon.com>
Link: https://lore.kernel.org/r/20240710133705.896445-5-huangjunxian6@hisilicon.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/hw/hns/hns_roce_device.h
drivers/infiniband/hw/hns/hns_roce_mr.c

index 3cc5a4ff404a71aea1bc47eb11a2d20015306b22..0b1e21cb6d2d38d5ce6fb6b06379e6121dfdd059 100644 (file)
@@ -83,6 +83,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
@@ -189,6 +190,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;
index 1a61dceb331979c09e52033d4e27c9540294b7f9..846da8c78b8b725dd588d0563da7b3d498735d9f 100644 (file)
@@ -443,6 +443,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);