lkml.org 
[lkml]   [2006]   [May]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 05/32] readahead: add look-ahead support to __do_page_cache_readahead()
    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: Wu Fengguang <wfg@mail.ustc.edu.cn>
    ---

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

    --- linux-2.6.17-rc4-mm3.orig/mm/readahead.c
    +++ linux-2.6.17-rc4-mm3/mm/readahead.c
    @@ -268,7 +268,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;
    @@ -281,7 +282,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.
    @@ -304,6 +305,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);
    @@ -340,7 +343,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;
    @@ -387,7 +390,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);
    }

    /*
    @@ -407,7 +410,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);
    }
    @@ -452,7 +455,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]()
    --
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2006-05-27 18:05    [W:2.812 / U:0.072 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site