svcrdma: limit FRMR page list lengths to device max
authorSteve Wise <swise@opengridcomputing.com>
Fri, 7 Aug 2015 16:11:20 +0000 (11:11 -0500)
committerDoug Ledford <dledford@redhat.com>
Sun, 30 Aug 2015 22:08:46 +0000 (18:08 -0400)
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>
net/sunrpc/xprtrdma/svc_rdma_transport.c

index 8752a2d653b5eebadad5888c8864ac959bb04e2a..11d5133c3f38c66d741355811a3b6858caf43dd8 100644 (file)
@@ -733,17 +733,19 @@ static struct svc_rdma_fastreg_mr *rdma_alloc_frmr(struct svcxprt_rdma *xprt)
        struct ib_mr *mr;
        struct ib_fast_reg_page_list *pl;
        struct svc_rdma_fastreg_mr *frmr;
+       u32 num_sg;
 
        frmr = kmalloc(sizeof(*frmr), GFP_KERNEL);
        if (!frmr)
                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))
                goto err_free_frmr;
 
        pl = ib_alloc_fast_reg_page_list(xprt->sc_cm_id->device,
-                                        RPCSVC_MAXPAGES);
+                                        num_sg);
        if (IS_ERR(pl))
                goto err_free_mr;