]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
sunrpc: Adjust size of socket's receive page array dynamically
authorChuck Lever <chuck.lever@oracle.com>
Mon, 28 Apr 2025 19:36:55 +0000 (15:36 -0400)
committerChuck Lever <chuck.lever@oracle.com>
Thu, 15 May 2025 20:16:25 +0000 (16:16 -0400)
As a step towards making NFSD's maximum rsize and wsize variable at
run-time, make sk_pages a flexible array.

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/svcsock.h
net/sunrpc/svcsock.c

index bf45d9e8492afcaadf3e4bbf3cd2b9773ca4a2a9..963bbe251e52109a902f6b9097b6e9c3c23b1fd8 100644 (file)
@@ -40,7 +40,9 @@ struct svc_sock {
 
        struct completion       sk_handshake_done;
 
-       struct page *           sk_pages[RPCSVC_MAXPAGES];      /* received data */
+       /* received data */
+       unsigned long           sk_maxpages;
+       struct page *           sk_pages[] __counted_by(sk_maxpages);
 };
 
 static inline u32 svc_sock_reclen(struct svc_sock *svsk)
index d9fdc6ae802056e7cc1e2735b5e42a7c016f8e53..e1c85123b445bf387e09565c025d8dd815187a07 100644 (file)
@@ -1339,7 +1339,8 @@ static void svc_tcp_init(struct svc_sock *svsk, struct svc_serv *serv)
                svsk->sk_marker = xdr_zero;
                svsk->sk_tcplen = 0;
                svsk->sk_datalen = 0;
-               memset(&svsk->sk_pages[0], 0, sizeof(svsk->sk_pages));
+               memset(&svsk->sk_pages[0], 0,
+                      svsk->sk_maxpages * sizeof(struct page *));
 
                tcp_sock_set_nodelay(sk);
 
@@ -1378,10 +1379,13 @@ static struct svc_sock *svc_setup_socket(struct svc_serv *serv,
        struct svc_sock *svsk;
        struct sock     *inet;
        int             pmap_register = !(flags & SVC_SOCK_ANONYMOUS);
+       unsigned long   pages;
 
-       svsk = kzalloc(sizeof(*svsk), GFP_KERNEL);
+       pages = svc_serv_maxpages(serv);
+       svsk = kzalloc(struct_size(svsk, sk_pages, pages), GFP_KERNEL);
        if (!svsk)
                return ERR_PTR(-ENOMEM);
+       svsk->sk_maxpages = pages;
 
        inet = sock->sk;