]> www.infradead.org Git - users/hch/misc.git/commitdiff
SUNRPC: Be even lazier about releasing pages
authorChuck Lever <chuck.lever@oracle.com>
Sat, 15 Apr 2023 00:18:15 +0000 (20:18 -0400)
committerChuck Lever <chuck.lever@oracle.com>
Thu, 27 Apr 2023 22:49:23 +0000 (18:49 -0400)
A single RPC transaction that touches only a couple of pages means
rq_pvec will not be even close to full in svc_xpt_release(). This is
a common case.

Instead, just leave the pages in rq_pvec until it is completely
full. This improves the efficiency of the batch release mechanism
on workloads that involve small RPC messages.

The rq_pvec is also fully emptied just before thread exit.

Reviewed-by: Calum Mackay <calum.mackay@oracle.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
net/sunrpc/svc.c
net/sunrpc/svc_xprt.c

index b982f802f2a02893050ab1ccc91855aea8e273bb..26367cf4c17a0d7e411126270864007eef873a4d 100644 (file)
@@ -649,6 +649,8 @@ svc_rqst_alloc(struct svc_serv *serv, struct svc_pool *pool, int node)
        if (!rqstp)
                return rqstp;
 
+       pagevec_init(&rqstp->rq_pvec);
+
        __set_bit(RQ_BUSY, &rqstp->rq_flags);
        rqstp->rq_server = serv;
        rqstp->rq_pool = pool;
@@ -894,6 +896,7 @@ void svc_rqst_release_pages(struct svc_rqst *rqstp)
 void
 svc_rqst_free(struct svc_rqst *rqstp)
 {
+       pagevec_release(&rqstp->rq_pvec);
        svc_release_buffer(rqstp);
        if (rqstp->rq_scratch_page)
                put_page(rqstp->rq_scratch_page);
index 533e08c4f3192c1a9cc96f46427ddb4f52efc80f..e3952b690f54ff666cfacddb52a8b4e0f7b76241 100644 (file)
@@ -541,7 +541,6 @@ static void svc_xprt_release(struct svc_rqst *rqstp)
        kfree(rqstp->rq_deferred);
        rqstp->rq_deferred = NULL;
 
-       pagevec_release(&rqstp->rq_pvec);
        svc_rqst_release_pages(rqstp);
        rqstp->rq_res.page_len = 0;
        rqstp->rq_res.page_base = 0;
@@ -667,8 +666,6 @@ static int svc_alloc_arg(struct svc_rqst *rqstp)
        struct xdr_buf *arg = &rqstp->rq_arg;
        unsigned long pages, filled, ret;
 
-       pagevec_init(&rqstp->rq_pvec);
-
        pages = (serv->sv_max_mesg + 2 * PAGE_SIZE) >> PAGE_SHIFT;
        if (pages > RPCSVC_MAXPAGES) {
                pr_warn_once("svc: warning: pages=%lu > RPCSVC_MAXPAGES=%lu\n",