mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-11-01 09:13:37 +00:00
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: Calum Mackay <calum.mackay@oracle.com> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
parent
647a2a6428
commit
6a0cdf56bf
2 changed files with 3 additions and 3 deletions
|
|
@ -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)
|
||||||
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)
|
||||||
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)
|
||||||
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",
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue