On Wed, 25 Oct 2000, Linus Torvalds wrote:
> On Wed, 25 Oct 2000, Rik van Riel wrote:
> >
> > OTOH, block-dev readahead makes sense for filesystems where
> > the packing locality is close to the access pattern BUT NOT
> > close to anything the page cache would recognise as being
> > close.
>
> I dunno. The main reason I'd like to get the block devices into
> the page cache is that right now there is no way to mmap them -
> something that can potentially be _very_ useful, regardless of
> readahead.
>
> And quite frankly, the generic file readahead has been pounded
> upon and tested a lot more than the block device read-ahead ever
> was. I bet it performs better if for no other reason.
Indeed.
Anyway, below is a patch that implements Al Viro's
readahead fix and one small readahead adjustment
that seems to make sense ...
regards,
Rik
-- "What you're running that piece of shit Gnome?!?!" -- Miguel de Icaza, UKUUG 2000http://www.conectiva.com/ http://www.surriel.com/
--- mm/filemap.c.orig Wed Oct 25 14:58:01 2000 +++ mm/filemap.c Wed Oct 25 15:06:23 2000 @@ -794,7 +794,7 @@ struct file * filp, struct inode * inode, struct page * page) { - unsigned long end_index = inode->i_size >> PAGE_CACHE_SHIFT; + unsigned long end_index = (inode->i_size + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; unsigned long index = page->index; unsigned long max_ahead, ahead; unsigned long raend; @@ -943,14 +943,28 @@ } /* * Adjust the current value of read-ahead max. - * If the read operation stay in the first half page, force no readahead. - * Otherwise try to increase read ahead max just enough to do the read request. - * Then, at least MIN_READAHEAD if read ahead is ok, - * and at most MAX_READAHEAD in all cases. */ - if (!index && offset + desc->count <= (PAGE_CACHE_SIZE >> 1)) { - filp->f_ramax = 0; + if (!index) { + /* + * If we start reading from the beginning of the file, + * read in MIN_READAHEAD pages. Note that if the file is + * smaller than MIN_READAHEAD * 2 limiting ourselves to + * MIN_READAHEAD would result in one 'too small' IO, so + * in that case we just read in the whole file. + */ + int ramax; + if ((inode->i_size >> PAGE_CACHE_SHIFT) > MIN_READAHEAD * 2) + ramax = MIN_READAHEAD; + else + ramax = inode->i_size >> PAGE_CACHE_SHIFT; + filp->f_ramax = ramax; } else { + /* + * Otherwise, if readahead is ok, we try to increase the + * read ahead maximum to be at least big enough for the + * current read request. Note that generic_file_readahead() + * will tune this value further... + */ unsigned long needed; needed = ((offset + desc->count) >> PAGE_CACHE_SHIFT) + 1;
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org Please read the FAQ at http://www.tux.org/lkml/
This archive was generated by hypermail 2b29 : Tue Oct 31 2000 - 21:00:16 EST