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 2000

http://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 [EMAIL PROTECTED]
Please read the FAQ at http://www.tux.org/lkml/

Reply via email to