Commit f4126823 authored by Chuck Lever's avatar Chuck Lever
Browse files

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: default avatarJeff Layton <jlayton@kernel.org>
Reviewed-by: default avatarNeilBrown <neil@brown.name>
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
parent 1259560b
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -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)
+6 −2
Original line number Diff line number Diff line
@@ -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;