Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

sunrpc: Adjust size of socket's receive page array dynamically

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>

Chuck Lever f4126823 1259560b

+9 -3
+3 -1
include/linux/sunrpc/svcsock.h
··· 40 40 41 41 struct completion sk_handshake_done; 42 42 43 - struct page * sk_pages[RPCSVC_MAXPAGES]; /* received data */ 43 + /* received data */ 44 + unsigned long sk_maxpages; 45 + struct page * sk_pages[] __counted_by(sk_maxpages); 44 46 }; 45 47 46 48 static inline u32 svc_sock_reclen(struct svc_sock *svsk)
+6 -2
net/sunrpc/svcsock.c
··· 1339 1339 svsk->sk_marker = xdr_zero; 1340 1340 svsk->sk_tcplen = 0; 1341 1341 svsk->sk_datalen = 0; 1342 - memset(&svsk->sk_pages[0], 0, sizeof(svsk->sk_pages)); 1342 + memset(&svsk->sk_pages[0], 0, 1343 + svsk->sk_maxpages * sizeof(struct page *)); 1343 1344 1344 1345 tcp_sock_set_nodelay(sk); 1345 1346 ··· 1379 1378 struct svc_sock *svsk; 1380 1379 struct sock *inet; 1381 1380 int pmap_register = !(flags & SVC_SOCK_ANONYMOUS); 1381 + unsigned long pages; 1382 1382 1383 - svsk = kzalloc(sizeof(*svsk), GFP_KERNEL); 1383 + pages = svc_serv_maxpages(serv); 1384 + svsk = kzalloc(struct_size(svsk, sk_pages, pages), GFP_KERNEL); 1384 1385 if (!svsk) 1385 1386 return ERR_PTR(-ENOMEM); 1387 + svsk->sk_maxpages = pages; 1386 1388 1387 1389 inet = sock->sk; 1388 1390