diff options
| author | Andrew Morton <akpm@zip.com.au> | 2002-07-18 21:11:11 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@home.transmeta.com> | 2002-07-18 21:11:11 -0700 |
| commit | b6938a7bd23a74cfa7a81c0765ec255ea1c7e12e (patch) | |
| tree | 80440a0f207cd26cd728b1d5e1ad7a8a00d4b4f6 /include/linux | |
| parent | e64fa3dbab40c7127aa218e91ae4f10cf2057f6e (diff) | |
[PATCH] readahead optimisations
Been looking at a workload which involves several processes which seek
around and read from a large file. There are a few problems:
generic_file_lseek is bouncing i_sem around like mad, and readahead is
doing lots of pointless pagecache probing.
This patch addresses readahead.
Presumably the change will be larger on machines which have higher
bandwidth memory than my test box, of which there are many.
This patch teaches readahead to detect the situation where no IO is
actually being performed as a result of its actions. Now, we don't
want to sacrifice IO efficiency to save a bit of CPU, so the code is
very cautious. But eventually, after some tens of consecutive
readahead attempts were found to perform no I/O at all, readahead will
turn itself off.
readahead will be turned on again when either generic_file_read() or
filemap_nopage() get a pagecache miss. The function
handle_ra_thrashing() has been renamed to handle_ra_miss() to reflect
its widened role.
A performance bug in page_cache_readround() was fixed - if
ra->next_size is zero, that function needs to leave it well alone,
because next_size==0 is a magic value meaning that the file has just
been opened and that readahead needs to get aggressive. This change
makes a `make dep' run at the same speed as in the 2.4 kernel. It used
to take 4x as long...
`make dep' is an interesting test because it uses mmap to read the files.
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/mm.h | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/include/linux/mm.h b/include/linux/mm.h index 0012e3900468..685868b9e0e4 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -466,11 +466,11 @@ int write_one_page(struct page *page, int wait); /* readahead.c */ #define VM_MAX_READAHEAD 128 /* kbytes */ #define VM_MIN_READAHEAD 16 /* kbytes (includes current page) */ -void do_page_cache_readahead(struct file *file, +int do_page_cache_readahead(struct file *file, unsigned long offset, unsigned long nr_to_read); void page_cache_readahead(struct file *file, unsigned long offset); void page_cache_readaround(struct file *file, unsigned long offset); -void handle_ra_thrashing(struct file *file); +void handle_ra_miss(struct file *file); /* vma is the first one with address < vma->vm_end, * and even address < vma->vm_start. Have to extend vma. */ |
