The patch titled
     readahead: add look-ahead support to __do_page_cache_readahead()
has been added to the -mm tree.  Its filename is
     readahead-add-look-ahead-support-to-__do_page_cache_readahead.patch

*** Remember to use Documentation/SubmitChecklist when testing your code ***

See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find
out what to do about this

------------------------------------------------------
Subject: readahead: add look-ahead support to __do_page_cache_readahead()
From: Fengguang Wu <[EMAIL PROTECTED]>

Add look-ahead support to __do_page_cache_readahead().

It works by
        - mark the Nth backwards page with PG_readahead,
        (which instructs the page's first reader to invoke readahead)
        - and only do the marking for newly allocated pages.
        (to prevent blindly doing readahead on already cached pages)

Look-ahead is a technique to achieve I/O pipelining:

While the application is working through a chunk of cached pages, the kernel
reads-ahead the next chunk of pages _before_ time of need.  It effectively
hides low level I/O latencies to high level applications.

Signed-off-by: Fengguang Wu <[EMAIL PROTECTED]>
Cc: Steven Pratt <[EMAIL PROTECTED]>
Cc: Ram Pai <[EMAIL PROTECTED]>
Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
---

 mm/readahead.c |   15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

diff -puN 
mm/readahead.c~readahead-add-look-ahead-support-to-__do_page_cache_readahead 
mm/readahead.c
--- 
a/mm/readahead.c~readahead-add-look-ahead-support-to-__do_page_cache_readahead
+++ a/mm/readahead.c
@@ -265,7 +265,8 @@ out:
  */
 static int
 __do_page_cache_readahead(struct address_space *mapping, struct file *filp,
-                       pgoff_t offset, unsigned long nr_to_read)
+                       pgoff_t offset, unsigned long nr_to_read,
+                       unsigned long lookahead_size)
 {
        struct inode *inode = mapping->host;
        struct page *page;
@@ -278,7 +279,7 @@ __do_page_cache_readahead(struct address
        if (isize == 0)
                goto out;
 
-       end_index = ((isize - 1) >> PAGE_CACHE_SHIFT);
+       end_index = ((isize - 1) >> PAGE_CACHE_SHIFT);
 
        /*
         * Preallocate as many pages as we will need.
@@ -301,6 +302,8 @@ __do_page_cache_readahead(struct address
                        break;
                page->index = page_offset;
                list_add(&page->lru, &page_pool);
+               if (page_idx == nr_to_read - lookahead_size)
+                       SetPageReadahead(page);
                ret++;
        }
        read_unlock_irq(&mapping->tree_lock);
@@ -337,7 +340,7 @@ int force_page_cache_readahead(struct ad
                if (this_chunk > nr_to_read)
                        this_chunk = nr_to_read;
                err = __do_page_cache_readahead(mapping, filp,
-                                               offset, this_chunk);
+                                               offset, this_chunk, 0);
                if (err < 0) {
                        ret = err;
                        break;
@@ -384,7 +387,7 @@ int do_page_cache_readahead(struct addre
        if (bdi_read_congested(mapping->backing_dev_info))
                return -1;
 
-       return __do_page_cache_readahead(mapping, filp, offset, nr_to_read);
+       return __do_page_cache_readahead(mapping, filp, offset, nr_to_read, 0);
 }
 
 /*
@@ -404,7 +407,7 @@ blockable_page_cache_readahead(struct ad
        if (!block && bdi_read_congested(mapping->backing_dev_info))
                return 0;
 
-       actual = __do_page_cache_readahead(mapping, filp, offset, nr_to_read);
+       actual = __do_page_cache_readahead(mapping, filp, offset, nr_to_read, 
0);
 
        return check_ra_success(ra, nr_to_read, actual);
 }
@@ -449,7 +452,7 @@ static int make_ahead_window(struct addr
  * @req_size: hint: total size of the read which the caller is performing in
  *            PAGE_CACHE_SIZE units
  *
- * page_cache_readahead() is the main function.  If performs the adaptive
+ * page_cache_readahead() is the main function.  It performs the adaptive
  * readahead window size management and submits the readahead I/O.
  *
  * Note that @filp is purely used for passing on to the ->readpage[s]()
_

Patches currently in -mm which might be from [EMAIL PROTECTED] are

readahead-introduce-pg_readahead.patch
readahead-add-look-ahead-support-to-__do_page_cache_readahead.patch
readahead-min_ra_pages-max_ra_pages-macros.patch
readahead-data-structure-and-routines.patch
readahead-on-demand-readahead-logic.patch
readahead-convert-filemap-invocations.patch
readahead-convert-splice-invocations.patch
readahead-convert-ext3-ext4-invocations.patch
readahead-remove-the-old-algorithm.patch

-
To unsubscribe from this list: send the line "unsubscribe mm-commits" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to