RDMA/irdma: Add 2 level PBLE support for FMR
authorMustafa Ismail <mustafa.ismail@intel.com>
Tue, 5 Jul 2022 23:08:09 +0000 (18:08 -0500)
committerLeon Romanovsky <leonro@nvidia.com>
Mon, 18 Jul 2022 07:39:28 +0000 (10:39 +0300)
Level 2 Physical Buffer List Entry (PBLE) is currently not supported for
Fast MRs which limits memory registrations to 256K pages.

Adapt irdma_set_page and irdma_alloc_mr to allow for 2 level PBLEs.

Link: https://lore.kernel.org/r/20220705230815.265-2-shiraz.saleem@intel.com
Signed-off-by: Mustafa Ismail <mustafa.ismail@intel.com>
Signed-off-by: Shiraz Saleem <shiraz.saleem@intel.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/hw/irdma/main.h
drivers/infiniband/hw/irdma/verbs.c

index ef862bc..65e966a 100644 (file)
@@ -85,7 +85,7 @@ extern struct auxiliary_driver i40iw_auxiliary_drv;
 #define        IRDMA_NO_QSET   0xffff
 
 #define IW_CFG_FPM_QP_COUNT            32768
-#define IRDMA_MAX_PAGES_PER_FMR                512
+#define IRDMA_MAX_PAGES_PER_FMR                262144
 #define IRDMA_MIN_PAGES_PER_FMR                1
 #define IRDMA_CQP_COMPL_RQ_WQE_FLUSHED 2
 #define IRDMA_CQP_COMPL_SQ_WQE_FLUSHED 3
index c4412ec..0f5856b 100644 (file)
@@ -2605,7 +2605,7 @@ static struct ib_mr *irdma_alloc_mr(struct ib_pd *pd, enum ib_mr_type mr_type,
        palloc = &iwpbl->pble_alloc;
        iwmr->page_cnt = max_num_sg;
        err_code = irdma_get_pble(iwdev->rf->pble_rsrc, palloc, iwmr->page_cnt,
-                                 true);
+                                 false);
        if (err_code)
                goto err_get_pble;
 
@@ -2641,8 +2641,16 @@ static int irdma_set_page(struct ib_mr *ibmr, u64 addr)
        if (unlikely(iwmr->npages == iwmr->page_cnt))
                return -ENOMEM;
 
-       pbl = palloc->level1.addr;
-       pbl[iwmr->npages++] = addr;
+       if (palloc->level == PBLE_LEVEL_2) {
+               struct irdma_pble_info *palloc_info =
+                       palloc->level2.leaf + (iwmr->npages >> PBLE_512_SHIFT);
+
+               palloc_info->addr[iwmr->npages & (PBLE_PER_PAGE - 1)] = addr;
+       } else {
+               pbl = palloc->level1.addr;
+               pbl[iwmr->npages] = addr;
+       }
+       iwmr->npages++;
 
        return 0;
 }