lkml.org 
[lkml]   [2007]   [Jan]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 6/8] readahead: thrashing recovery method fix
    - keep lookahead_index if the current chunk is lost, so that when we
    revisted this stream, the state based method see a consistent state.
    - correct the thrashing-threshold computation
    - discount read-ahead size more, to free more memory to the system on pressure
    - disable look-ahead when thrashed, just to be safe

    Signed-off-by: Fengguang Wu <wfg@mail.ustc.edu.cn>
    ---
    mm/readahead.c | 28 +++++++++++++---------------
    1 file changed, 13 insertions(+), 15 deletions(-)

    --- linux-2.6.20-rc4-mm1.orig/mm/readahead.c
    +++ linux-2.6.20-rc4-mm1/mm/readahead.c
    @@ -1524,28 +1524,26 @@ thrashing_recovery_readahead(struct addr
    ra->readahead_index - offset);
    #endif

    - /*
    - * Some thrashing occur in (ra_index, la_index], in which case the
    - * old read-ahead chunk is lost soon after the new one is allocated.
    - * Ensure that we recover all needed pages in the old chunk.
    - */
    - if (offset < ra->ra_index)
    - ra_size = ra->ra_index - offset;
    - else {
    + if (offset < ra->ra_index) {
    + /*
    + * Thrashed when we are in [la_index, ra_index), i.e.
    + * the old chunk is lost soon after the new one is allocated.
    + * Ensure that we recover all needed pages in the old chunk.
    + * And futher keep the lookahead_index untouched.
    + */
    + ra_size = ra->lookahead_index - offset;
    + } else {
    /* After thrashing, we know the exact thrashing-threshold. */
    - ra_size = offset - ra->ra_index;
    + ra_size = offset - ra->la_index;
    update_ra_thrash_bytes(mapping->backing_dev_info, ra_size);

    - /* And we'd better be a bit conservative. */
    - ra_size = ra_size * 3 / 4;
    + /* And be cooperative: the system may be hunting for memory. */
    + ra_size = MIN_RA_PAGES + ra_size / 2;
    }

    - if (ra_size > ra_max)
    - ra_size = ra_max;
    -
    ra_set_class(ra, RA_CLASS_THRASHING);
    ra_set_index(ra, offset, offset);
    - ra_set_size(ra, ra_size, ra_size / LOOKAHEAD_RATIO);
    + ra_set_size(ra, ra_size, 0);

    return ra_submit(ra, mapping, filp);
    }
    --
    -
    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-01-27 09:31    [W:0.023 / U:88.684 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site