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>
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user