forked from Minki/linux
svcrdma: limit FRMR page list lengths to device max
Svcrdma was incorrectly allocating fastreg MRs and page lists using RPCSVC_MAXPAGES, which can exceed the device capabilities. So limit the depth to the minimum of RPCSVC_MAXPAGES and xprt->sc_frmr_pg_list_len. Signed-off-by: Steve Wise <swise@opengridcomputing.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
parent
0410e38eca
commit
9ac07501e1
|
@ -733,17 +733,19 @@ static struct svc_rdma_fastreg_mr *rdma_alloc_frmr(struct svcxprt_rdma *xprt)
|
||||||
struct ib_mr *mr;
|
struct ib_mr *mr;
|
||||||
struct ib_fast_reg_page_list *pl;
|
struct ib_fast_reg_page_list *pl;
|
||||||
struct svc_rdma_fastreg_mr *frmr;
|
struct svc_rdma_fastreg_mr *frmr;
|
||||||
|
u32 num_sg;
|
||||||
|
|
||||||
frmr = kmalloc(sizeof(*frmr), GFP_KERNEL);
|
frmr = kmalloc(sizeof(*frmr), GFP_KERNEL);
|
||||||
if (!frmr)
|
if (!frmr)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
mr = ib_alloc_mr(xprt->sc_pd, IB_MR_TYPE_MEM_REG, RPCSVC_MAXPAGES);
|
num_sg = min_t(u32, RPCSVC_MAXPAGES, xprt->sc_frmr_pg_list_len);
|
||||||
|
mr = ib_alloc_mr(xprt->sc_pd, IB_MR_TYPE_MEM_REG, num_sg);
|
||||||
if (IS_ERR(mr))
|
if (IS_ERR(mr))
|
||||||
goto err_free_frmr;
|
goto err_free_frmr;
|
||||||
|
|
||||||
pl = ib_alloc_fast_reg_page_list(xprt->sc_cm_id->device,
|
pl = ib_alloc_fast_reg_page_list(xprt->sc_cm_id->device,
|
||||||
RPCSVC_MAXPAGES);
|
num_sg);
|
||||||
if (IS_ERR(pl))
|
if (IS_ERR(pl))
|
||||||
goto err_free_mr;
|
goto err_free_mr;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user