diff options
author | Chuck Lever <chuck.lever@oracle.com> | 2021-06-28 23:24:27 +0200 |
---|---|---|
committer | Chuck Lever <chuck.lever@oracle.com> | 2021-08-17 17:47:52 +0200 |
commit | 496d83cf0f2fa70cfe256c2499e2d3523d3868f3 (patch) | |
tree | deb2492a54153a260103fb031416c23aeb5a6971 /fs/nfsd | |
parent | SUNRPC: Add svc_rqst_replace_page() API (diff) | |
download | linux-496d83cf0f2fa70cfe256c2499e2d3523d3868f3.tar.xz linux-496d83cf0f2fa70cfe256c2499e2d3523d3868f3.zip |
NFSD: Batch release pages during splice read
Large splice reads call put_page() repeatedly. put_page() is
relatively expensive to call, so replace it with the new
svc_rqst_replace_page() helper to help amortize that cost.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Reviewed-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'fs/nfsd')
-rw-r--r-- | fs/nfsd/vfs.c | 9 |
1 files changed, 2 insertions, 7 deletions
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index 46a6d9fce3d2..7732a384f949 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c @@ -849,15 +849,10 @@ nfsd_splice_actor(struct pipe_inode_info *pipe, struct pipe_buffer *buf, struct page *page = buf->page; if (rqstp->rq_res.page_len == 0) { - get_page(page); - put_page(*rqstp->rq_next_page); - *(rqstp->rq_next_page++) = page; + svc_rqst_replace_page(rqstp, page); rqstp->rq_res.page_base = buf->offset; } else if (page != pp[-1]) { - get_page(page); - if (*rqstp->rq_next_page) - put_page(*rqstp->rq_next_page); - *(rqstp->rq_next_page++) = page; + svc_rqst_replace_page(rqstp, page); } rqstp->rq_res.page_len += sd->len; |