From 560c587e650c82b17859b84c9558377135bb35a9 Mon Sep 17 00:00:00 2001 From: Fengguang Wu Date: Tue, 16 Oct 2007 01:24:34 -0700 Subject: [PATCH] --- yaml --- r: 69596 b: refs/heads/master c: 6b10c6c9fbfe754e8482efb8c8b84f8e40c0f2eb h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/mm/readahead.c | 33 +++++++++++++++++++++++---------- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/[refs] b/[refs] index 2c566d4bb74b..258083e9124b 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 6df8ba4f8a4c4abca9ccad10441d0dddbdff301c +refs/heads/master: 6b10c6c9fbfe754e8482efb8c8b84f8e40c0f2eb diff --git a/trunk/mm/readahead.c b/trunk/mm/readahead.c index 4a58befbde4a..fd588ffc5086 100644 --- a/trunk/mm/readahead.c +++ b/trunk/mm/readahead.c @@ -379,6 +379,29 @@ ondemand_readahead(struct address_space *mapping, offset, req_size, 0); } + /* + * Hit a marked page without valid readahead state. + * E.g. interleaved reads. + * Query the pagecache for async_size, which normally equals to + * readahead size. Ramp it up and use it as the new readahead size. + */ + if (hit_readahead_marker) { + pgoff_t start; + + read_lock_irq(&mapping->tree_lock); + start = radix_tree_next_hole(&mapping->page_tree, offset, max+1); + read_unlock_irq(&mapping->tree_lock); + + if (!start || start - offset > max) + return 0; + + ra->start = start; + ra->size = start - offset; /* old async_size */ + ra->size = get_next_ra_size(ra, max); + ra->async_size = ra->size; + goto readit; + } + /* * It may be one of * - first read on start of file @@ -390,16 +413,6 @@ ondemand_readahead(struct address_space *mapping, ra->size = get_init_ra_size(req_size, max); ra->async_size = ra->size > req_size ? ra->size - req_size : ra->size; - /* - * Hit on a marked page without valid readahead state. - * E.g. interleaved reads. - * Not knowing its readahead pos/size, bet on the minimal possible one. - */ - if (hit_readahead_marker) { - ra->start++; - ra->size = get_next_ra_size(ra, max); - } - readit: return ra_submit(ra, mapping, filp); }