Messages in this thread Patch in this message | | | Date | Sun, 16 Dec 2007 19:59:31 +0800 | From | Fengguang Wu <> | Subject | [PATCH 3/9] readahead: auto detection of sequential mmap reads |
| |
Auto-detect sequential mmap reads and do sync/async readahead for them.
The sequential mmap readahead will be triggered when - sync readahead: it's a major fault and (prev_offset==offset-1); - async readahead: minor fault on PG_readahead page with valid readahead state.
It's a bit conservative to require valid readahead state for async readahead, which means we don't do readahead for interleaved reads for now, but let's make it safe for this initial try.
Signed-off-by: Fengguang Wu <wfg@mail.ustc.edu.cn> ---
--- mm/filemap.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
--- linux-2.6.24-rc4-mm1.orig/mm/filemap.c +++ linux-2.6.24-rc4-mm1/mm/filemap.c @@ -1318,7 +1318,8 @@ static void do_sync_mmap_readahead(struc if (VM_RandomReadHint(vma)) return; - if (VM_SequentialReadHint(vma)) { + if (VM_SequentialReadHint(vma) || + offset - 1 == (ra->prev_pos >> PAGE_CACHE_SHIFT)) { page_cache_sync_readahead(mapping, ra, file, offset, 1); return; } @@ -1360,7 +1361,8 @@ static void do_async_mmap_readahead(stru return; if (ra->mmap_miss > 0) ra->mmap_miss--; - if (PageReadahead(page)) + if (PageReadahead(page) && + offset == ra->start + ra->size - ra->async_size) page_cache_async_readahead(mapping, ra, file, page, offset, 1); } --
| |