Commit 431a4820 authored by Fengguang Wu's avatar Fengguang Wu Committed by Linus Torvalds

readahead: move synchronous readahead call out of splice loop

Move synchronous page_cache_readahead_ondemand() call out of splice loop.

This avoids one pointless page allocation/insertion in case of non-zero
ra_pages, or many pointless readahead calls in case of zero ra_pages.

Note that if a user sets ra_pages to less than PIPE_BUFFERS=16 pages, he will
not get expected readahead behavior anyway.  The splice code works in batches
of 16 pages, which can be taken as another form of synchronous readahead.
Signed-off-by: default avatarFengguang Wu <wfg@mail.ustc.edu.cn>
Cc: Jens Axboe <jens.axboe@oracle.com>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent c743d96b
...@@ -290,13 +290,17 @@ __generic_file_splice_read(struct file *in, loff_t *ppos, ...@@ -290,13 +290,17 @@ __generic_file_splice_read(struct file *in, loff_t *ppos,
* Lookup the (hopefully) full range of pages we need. * Lookup the (hopefully) full range of pages we need.
*/ */
spd.nr_pages = find_get_pages_contig(mapping, index, nr_pages, pages); spd.nr_pages = find_get_pages_contig(mapping, index, nr_pages, pages);
index += spd.nr_pages;
/* /*
* If find_get_pages_contig() returned fewer pages than we needed, * If find_get_pages_contig() returned fewer pages than we needed,
* allocate the rest and fill in the holes. * readahead/allocate the rest and fill in the holes.
*/ */
if (spd.nr_pages < nr_pages)
page_cache_readahead_ondemand(mapping, &in->f_ra, in,
NULL, index, nr_pages - spd.nr_pages);
error = 0; error = 0;
index += spd.nr_pages;
while (spd.nr_pages < nr_pages) { while (spd.nr_pages < nr_pages) {
/* /*
* Page could be there, find_get_pages_contig() breaks on * Page could be there, find_get_pages_contig() breaks on
...@@ -304,9 +308,6 @@ __generic_file_splice_read(struct file *in, loff_t *ppos, ...@@ -304,9 +308,6 @@ __generic_file_splice_read(struct file *in, loff_t *ppos,
*/ */
page = find_get_page(mapping, index); page = find_get_page(mapping, index);
if (!page) { if (!page) {
page_cache_readahead_ondemand(mapping, &in->f_ra, in,
NULL, index, nr_pages - spd.nr_pages);
/* /*
* page didn't exist, allocate one. * page didn't exist, allocate one.
*/ */
......
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