Commit 6a0cdf56 authored by Chuck Lever's avatar Chuck Lever

SUNRPC: Be even lazier about releasing pages

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: default avatarCalum Mackay <calum.mackay@oracle.com>
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
parent 647a2a64
...@@ -649,6 +649,8 @@ svc_rqst_alloc(struct svc_serv *serv, struct svc_pool *pool, int node) ...@@ -649,6 +649,8 @@ svc_rqst_alloc(struct svc_serv *serv, struct svc_pool *pool, int node)
if (!rqstp) if (!rqstp)
return rqstp; return rqstp;
pagevec_init(&rqstp->rq_pvec);
__set_bit(RQ_BUSY, &rqstp->rq_flags); __set_bit(RQ_BUSY, &rqstp->rq_flags);
rqstp->rq_server = serv; rqstp->rq_server = serv;
rqstp->rq_pool = pool; rqstp->rq_pool = pool;
...@@ -894,6 +896,7 @@ void svc_rqst_release_pages(struct svc_rqst *rqstp) ...@@ -894,6 +896,7 @@ void svc_rqst_release_pages(struct svc_rqst *rqstp)
void void
svc_rqst_free(struct svc_rqst *rqstp) svc_rqst_free(struct svc_rqst *rqstp)
{ {
pagevec_release(&rqstp->rq_pvec);
svc_release_buffer(rqstp); svc_release_buffer(rqstp);
if (rqstp->rq_scratch_page) if (rqstp->rq_scratch_page)
put_page(rqstp->rq_scratch_page); put_page(rqstp->rq_scratch_page);
......
...@@ -541,7 +541,6 @@ static void svc_xprt_release(struct svc_rqst *rqstp) ...@@ -541,7 +541,6 @@ static void svc_xprt_release(struct svc_rqst *rqstp)
kfree(rqstp->rq_deferred); kfree(rqstp->rq_deferred);
rqstp->rq_deferred = NULL; rqstp->rq_deferred = NULL;
pagevec_release(&rqstp->rq_pvec);
svc_rqst_release_pages(rqstp); svc_rqst_release_pages(rqstp);
rqstp->rq_res.page_len = 0; rqstp->rq_res.page_len = 0;
rqstp->rq_res.page_base = 0; rqstp->rq_res.page_base = 0;
...@@ -667,8 +666,6 @@ static int svc_alloc_arg(struct svc_rqst *rqstp) ...@@ -667,8 +666,6 @@ static int svc_alloc_arg(struct svc_rqst *rqstp)
struct xdr_buf *arg = &rqstp->rq_arg; struct xdr_buf *arg = &rqstp->rq_arg;
unsigned long pages, filled, ret; unsigned long pages, filled, ret;
pagevec_init(&rqstp->rq_pvec);
pages = (serv->sv_max_mesg + 2 * PAGE_SIZE) >> PAGE_SHIFT; pages = (serv->sv_max_mesg + 2 * PAGE_SIZE) >> PAGE_SHIFT;
if (pages > RPCSVC_MAXPAGES) { if (pages > RPCSVC_MAXPAGES) {
pr_warn_once("svc: warning: pages=%lu > RPCSVC_MAXPAGES=%lu\n", pr_warn_once("svc: warning: pages=%lu > RPCSVC_MAXPAGES=%lu\n",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment