diff options
author | Fengguang Wu <wfg@mail.ustc.edu.cn> | 2007-07-19 04:48:05 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-07-19 13:04:44 -0400 |
commit | 431a4820bfcdf7ff530e745230bafb06c9bf2d6d (patch) | |
tree | 0b2396609deec8da5697979bce4c8ee18af254e6 | |
parent | c743d96b6d2ff55a94df7b5ac7c74987bb9c343b (diff) |
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: Fengguang Wu <wfg@mail.ustc.edu.cn>
Cc: Jens Axboe <jens.axboe@oracle.com>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | fs/splice.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/fs/splice.c b/fs/splice.c index 722449f7d5d6..421b3b821152 100644 --- a/fs/splice.c +++ b/fs/splice.c | |||
@@ -290,13 +290,17 @@ __generic_file_splice_read(struct file *in, loff_t *ppos, | |||
290 | * Lookup the (hopefully) full range of pages we need. | 290 | * Lookup the (hopefully) full range of pages we need. |
291 | */ | 291 | */ |
292 | spd.nr_pages = find_get_pages_contig(mapping, index, nr_pages, pages); | 292 | spd.nr_pages = find_get_pages_contig(mapping, index, nr_pages, pages); |
293 | index += spd.nr_pages; | ||
293 | 294 | ||
294 | /* | 295 | /* |
295 | * If find_get_pages_contig() returned fewer pages than we needed, | 296 | * If find_get_pages_contig() returned fewer pages than we needed, |
296 | * allocate the rest and fill in the holes. | 297 | * readahead/allocate the rest and fill in the holes. |
297 | */ | 298 | */ |
299 | if (spd.nr_pages < nr_pages) | ||
300 | page_cache_readahead_ondemand(mapping, &in->f_ra, in, | ||
301 | NULL, index, nr_pages - spd.nr_pages); | ||
302 | |||
298 | error = 0; | 303 | error = 0; |
299 | index += spd.nr_pages; | ||
300 | while (spd.nr_pages < nr_pages) { | 304 | while (spd.nr_pages < nr_pages) { |
301 | /* | 305 | /* |
302 | * Page could be there, find_get_pages_contig() breaks on | 306 | * 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 | */ | 308 | */ |
305 | page = find_get_page(mapping, index); | 309 | page = find_get_page(mapping, index); |
306 | if (!page) { | 310 | if (!page) { |
307 | page_cache_readahead_ondemand(mapping, &in->f_ra, in, | ||
308 | NULL, index, nr_pages - spd.nr_pages); | ||
309 | |||
310 | /* | 311 | /* |
311 | * page didn't exist, allocate one. | 312 | * page didn't exist, allocate one. |
312 | */ | 313 | */ |