Commit 59cf7346 authored by Chuck Lever's avatar Chuck Lever
Browse files

sunrpc: Replace the rq_bvec array with dynamically-allocated memory



As a step towards making NFSD's maximum rsize and wsize variable at
run-time, replace the fixed-size rq_bvec[] array in struct svc_rqst
with a chunk of dynamically-allocated memory.

The rq_bvec[] array contains enough bio_vecs to handle each page in
a maximum size RPC message.

On a system with 8-byte pointers and 4KB pages, pahole reports that
the rq_bvec[] array is 4144 bytes. This patch replaces that array
with a single 8-byte pointer field.

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 ed603bcf
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -213,7 +213,7 @@ struct svc_rqst {

	struct folio_batch	rq_fbatch;
	struct kvec		rq_vec[RPCSVC_MAXPAGES]; /* generally useful.. */
	struct bio_vec		rq_bvec[RPCSVC_MAXPAGES];
	struct bio_vec		*rq_bvec;

	__be32			rq_xid;		/* transmission id */
	u32			rq_prog;	/* program number */
+7 −0
Original line number Diff line number Diff line
@@ -672,6 +672,7 @@ static void
svc_rqst_free(struct svc_rqst *rqstp)
{
	folio_batch_release(&rqstp->rq_fbatch);
	kfree(rqstp->rq_bvec);
	svc_release_buffer(rqstp);
	if (rqstp->rq_scratch_page)
		put_page(rqstp->rq_scratch_page);
@@ -710,6 +711,12 @@ svc_prepare_thread(struct svc_serv *serv, struct svc_pool *pool, int node)
	if (!svc_init_buffer(rqstp, serv, node))
		goto out_enomem;

	rqstp->rq_bvec = kcalloc_node(rqstp->rq_maxpages,
				      sizeof(struct bio_vec),
				      GFP_KERNEL, node);
	if (!rqstp->rq_bvec)
		goto out_enomem;

	rqstp->rq_err = -EAGAIN; /* No error yet */

	serv->sv_nrthreads += 1;
+3 −4
Original line number Diff line number Diff line
@@ -713,8 +713,7 @@ static int svc_udp_sendto(struct svc_rqst *rqstp)
	if (svc_xprt_is_dead(xprt))
		goto out_notconn;

	count = xdr_buf_to_bvec(rqstp->rq_bvec,
				ARRAY_SIZE(rqstp->rq_bvec), xdr);
	count = xdr_buf_to_bvec(rqstp->rq_bvec, rqstp->rq_maxpages, xdr);

	iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, rqstp->rq_bvec,
		      count, rqstp->rq_res.len);
@@ -1219,8 +1218,8 @@ static int svc_tcp_sendmsg(struct svc_sock *svsk, struct svc_rqst *rqstp,
	memcpy(buf, &marker, sizeof(marker));
	bvec_set_virt(rqstp->rq_bvec, buf, sizeof(marker));

	count = xdr_buf_to_bvec(rqstp->rq_bvec + 1,
				ARRAY_SIZE(rqstp->rq_bvec) - 1, &rqstp->rq_res);
	count = xdr_buf_to_bvec(rqstp->rq_bvec + 1, rqstp->rq_maxpages,
				&rqstp->rq_res);

	iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, rqstp->rq_bvec,
		      1 + count, sizeof(marker) + rqstp->rq_res.len);