Skip to content

Commit 693a538

Browse files
zhuyjrleon
authored andcommitted
RDMA/irdma: Split mr alloc and free into new functions
In the function irdma_reg_user_mr, the mr allocation and free will be used by other functions. As such, the source codes related with mr allocation and free are split into the new functions. Reviewed-by: Shiraz Saleem <[email protected]> Signed-off-by: Zhu Yanjun <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Leon Romanovsky <[email protected]>
1 parent 01798df commit 693a538

File tree

1 file changed

+46
-28
lines changed

1 file changed

+46
-28
lines changed

drivers/infiniband/hw/irdma/verbs.c

Lines changed: 46 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2793,6 +2793,48 @@ static int irdma_reg_user_mr_type_mem(struct irdma_mr *iwmr, int access)
27932793
return err;
27942794
}
27952795

2796+
static struct irdma_mr *irdma_alloc_iwmr(struct ib_umem *region,
2797+
struct ib_pd *pd, u64 virt,
2798+
enum irdma_memreg_type reg_type)
2799+
{
2800+
struct irdma_device *iwdev = to_iwdev(pd->device);
2801+
struct irdma_pbl *iwpbl = NULL;
2802+
struct irdma_mr *iwmr = NULL;
2803+
unsigned long pgsz_bitmap;
2804+
2805+
iwmr = kzalloc(sizeof(*iwmr), GFP_KERNEL);
2806+
if (!iwmr)
2807+
return ERR_PTR(-ENOMEM);
2808+
2809+
iwpbl = &iwmr->iwpbl;
2810+
iwpbl->iwmr = iwmr;
2811+
iwmr->region = region;
2812+
iwmr->ibmr.pd = pd;
2813+
iwmr->ibmr.device = pd->device;
2814+
iwmr->ibmr.iova = virt;
2815+
iwmr->type = reg_type;
2816+
2817+
pgsz_bitmap = (reg_type == IRDMA_MEMREG_TYPE_MEM) ?
2818+
iwdev->rf->sc_dev.hw_attrs.page_size_cap : PAGE_SIZE;
2819+
2820+
iwmr->page_size = ib_umem_find_best_pgsz(region, pgsz_bitmap, virt);
2821+
if (unlikely(!iwmr->page_size)) {
2822+
kfree(iwmr);
2823+
return ERR_PTR(-EOPNOTSUPP);
2824+
}
2825+
2826+
iwmr->len = region->length;
2827+
iwpbl->user_base = virt;
2828+
iwmr->page_cnt = ib_umem_num_dma_blocks(region, iwmr->page_size);
2829+
2830+
return iwmr;
2831+
}
2832+
2833+
static void irdma_free_iwmr(struct irdma_mr *iwmr)
2834+
{
2835+
kfree(iwmr);
2836+
}
2837+
27962838
/**
27972839
* irdma_reg_user_mr - Register a user memory region
27982840
* @pd: ptr of pd
@@ -2838,34 +2880,13 @@ static struct ib_mr *irdma_reg_user_mr(struct ib_pd *pd, u64 start, u64 len,
28382880
return ERR_PTR(-EFAULT);
28392881
}
28402882

2841-
iwmr = kzalloc(sizeof(*iwmr), GFP_KERNEL);
2842-
if (!iwmr) {
2883+
iwmr = irdma_alloc_iwmr(region, pd, virt, req.reg_type);
2884+
if (IS_ERR(iwmr)) {
28432885
ib_umem_release(region);
2844-
return ERR_PTR(-ENOMEM);
2886+
return (struct ib_mr *)iwmr;
28452887
}
28462888

28472889
iwpbl = &iwmr->iwpbl;
2848-
iwpbl->iwmr = iwmr;
2849-
iwmr->region = region;
2850-
iwmr->ibmr.pd = pd;
2851-
iwmr->ibmr.device = pd->device;
2852-
iwmr->ibmr.iova = virt;
2853-
iwmr->page_size = PAGE_SIZE;
2854-
2855-
if (req.reg_type == IRDMA_MEMREG_TYPE_MEM) {
2856-
iwmr->page_size = ib_umem_find_best_pgsz(region,
2857-
iwdev->rf->sc_dev.hw_attrs.page_size_cap,
2858-
virt);
2859-
if (unlikely(!iwmr->page_size)) {
2860-
kfree(iwmr);
2861-
ib_umem_release(region);
2862-
return ERR_PTR(-EOPNOTSUPP);
2863-
}
2864-
}
2865-
iwmr->len = region->length;
2866-
iwpbl->user_base = virt;
2867-
iwmr->type = req.reg_type;
2868-
iwmr->page_cnt = ib_umem_num_dma_blocks(region, iwmr->page_size);
28692890

28702891
switch (req.reg_type) {
28712892
case IRDMA_MEMREG_TYPE_QP:
@@ -2918,13 +2939,10 @@ static struct ib_mr *irdma_reg_user_mr(struct ib_pd *pd, u64 start, u64 len,
29182939
goto error;
29192940
}
29202941

2921-
iwmr->type = req.reg_type;
2922-
29232942
return &iwmr->ibmr;
2924-
29252943
error:
29262944
ib_umem_release(region);
2927-
kfree(iwmr);
2945+
irdma_free_iwmr(iwmr);
29282946

29292947
return ERR_PTR(err);
29302948
}

0 commit comments

Comments
 (0)