lkml.org 
[lkml]   [2007]   [May]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 6/9] readahead: convert filemap invocations
    Convert filemap reads to use on-demand readahead.

    The new call scheme is to
    - call readahead on non-cached page
    - call readahead on look-ahead page
    - update prev_index when finished with the read request

    Signed-off-by: Fengguang Wu <wfg@mail.ustc.edu.cn>
    ---
    mm/filemap.c | 51 +++++++++++++++++++++++++++++--------------------
    1 file changed, 31 insertions(+), 20 deletions(-)

    --- linux-2.6.22-rc1-mm1.orig/mm/filemap.c
    +++ linux-2.6.22-rc1-mm1/mm/filemap.c
    @@ -916,15 +916,20 @@ void do_generic_mapping_read(struct addr
    nr = nr - offset;

    cond_resched();
    - if (index == next_index)
    - next_index = page_cache_readahead(mapping, &ra, filp,
    - index, last_index - index);
    -
    find_page:
    page = find_get_page(mapping, index);
    - if (unlikely(page == NULL)) {
    - handle_ra_miss(mapping, &ra, index);
    - goto no_cached_page;
    + if (!page) {
    + page_cache_readahead_ondemand(mapping,
    + &ra, filp, page,
    + index, last_index - index);
    + page = find_get_page(mapping, index);
    + if (unlikely(page == NULL))
    + goto no_cached_page;
    + }
    + if (PageReadahead(page)) {
    + page_cache_readahead_ondemand(mapping,
    + &ra, filp, page,
    + index, last_index - index);
    }
    if (!PageUptodate(page))
    goto page_not_up_to_date;
    @@ -1075,6 +1080,7 @@ no_cached_page:

    out:
    *_ra = ra;
    + _ra->prev_index = prev_index;

    *ppos = ((loff_t) index << PAGE_CACHE_SHIFT) + offset;
    if (cached_page)
    @@ -1378,26 +1384,30 @@ struct page *filemap_fault(struct vm_are
    goto no_cached_page;

    /*
    - * The readahead code wants to be told about each and every page
    - * so it can build and shrink its windows appropriately
    - *
    - * For sequential accesses, we use the generic readahead logic.
    - */
    - if (VM_SequentialReadHint(vma))
    - page_cache_readahead(mapping, ra, file, fdata->pgoff, 1);
    -
    - /*
    * Do we have something in the page cache already?
    */
    retry_find:
    page = find_lock_page(mapping, fdata->pgoff);
    + /*
    + * For sequential accesses, we use the generic readahead logic.
    + */
    + if (VM_SequentialReadHint(vma)) {
    + if (!page) {
    + page_cache_readahead_ondemand(mapping, ra, file, page,
    + fdata->pgoff, 1);
    + page = find_lock_page(mapping, fdata->pgoff);
    + if (!page)
    + goto no_cached_page;
    + }
    + if (PageReadahead(page)) {
    + page_cache_readahead_ondemand(mapping, ra, file, page,
    + fdata->pgoff, 1);
    + }
    + }
    +
    if (!page) {
    unsigned long ra_pages;

    - if (VM_SequentialReadHint(vma)) {
    - handle_ra_miss(mapping, ra, fdata->pgoff);
    - goto no_cached_page;
    - }
    ra->mmap_miss++;

    /*
    @@ -1450,6 +1460,7 @@ retry_find:
    * Found the page and have a reference on it.
    */
    mark_page_accessed(page);
    + ra->prev_index = page->index;
    return page;

    outside_data_content:
    --
    -
    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: 2007-05-17 00:51    [W:0.029 / U:58.692 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site