]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
svcrdma: Adjust the number of entries in svc_rdma_recv_ctxt::rc_pages
authorChuck Lever <chuck.lever@oracle.com>
Mon, 28 Apr 2025 19:36:56 +0000 (15:36 -0400)
committerChuck Lever <chuck.lever@oracle.com>
Thu, 15 May 2025 20:16:26 +0000 (16:16 -0400)
Allow allocation of more entries in the rc_pages[] array when the
maximum size of an RPC message is increased.

Reviewed-by: Jeff Layton <jlayton@kernel.org>
Reviewed-by: NeilBrown <neil@brown.name>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
include/linux/sunrpc/svc_rdma.h
net/sunrpc/xprtrdma/svc_rdma_recvfrom.c

index 619fc0bd837a8e3825f922db9d66c3c4674d9813..1016f2feddc4b12c7e5a0f41bc277d50aa9e4aaa 100644 (file)
@@ -202,7 +202,8 @@ struct svc_rdma_recv_ctxt {
        struct svc_rdma_pcl     rc_reply_pcl;
 
        unsigned int            rc_page_count;
-       struct page             *rc_pages[RPCSVC_MAXPAGES];
+       unsigned long           rc_maxpages;
+       struct page             *rc_pages[] __counted_by(rc_maxpages);
 };
 
 /*
index 292022f0976e17b2226612ae12b2e1e6d71fc757..e7e4a39ca6c65d69e0335aac4d80c395a3e282c5 100644 (file)
@@ -120,12 +120,16 @@ svc_rdma_recv_ctxt_alloc(struct svcxprt_rdma *rdma)
 {
        int node = ibdev_to_node(rdma->sc_cm_id->device);
        struct svc_rdma_recv_ctxt *ctxt;
+       unsigned long pages;
        dma_addr_t addr;
        void *buffer;
 
-       ctxt = kzalloc_node(sizeof(*ctxt), GFP_KERNEL, node);
+       pages = svc_serv_maxpages(rdma->sc_xprt.xpt_server);
+       ctxt = kzalloc_node(struct_size(ctxt, rc_pages, pages),
+                           GFP_KERNEL, node);
        if (!ctxt)
                goto fail0;
+       ctxt->rc_maxpages = pages;
        buffer = kmalloc_node(rdma->sc_max_req_size, GFP_KERNEL, node);
        if (!buffer)
                goto fail1;
@@ -497,7 +501,7 @@ static bool xdr_check_write_chunk(struct svc_rdma_recv_ctxt *rctxt)
         * a computation, perform a simple range check. This is an
         * arbitrary but sensible limit (ie, not architectural).
         */
-       if (unlikely(segcount > RPCSVC_MAXPAGES))
+       if (unlikely(segcount > rctxt->rc_maxpages))
                return false;
 
        p = xdr_inline_decode(&rctxt->rc_stream,