lkml.org 
[lkml]   [2011]   [May]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 05/18] writeback: the kupdate expire timestamp should be a moving target
    Dynamically compute the dirty expire timestamp at queue_io() time.

    writeback_control.older_than_this used to be determined at entrance to
    the kupdate writeback work. This _static_ timestamp may go stale if the
    kupdate work runs on and on. The flusher may then stuck with some old
    busy inodes, never considering newly expired inodes thereafter.

    This has two possible problems:

    - It is unfair for a large dirty inode to delay (for a long time) the
    writeback of small dirty inodes.

    - As time goes by, the large and busy dirty inode may contain only
    _freshly_ dirtied pages. Ignoring newly expired dirty inodes risks
    delaying the expired dirty pages to the end of LRU lists, triggering
    the evil pageout(). Nevertheless this patch merely addresses part
    of the problem.

    v2: keep policy changes inside wb_writeback() and keep the
    wbc.older_than_this visibility as suggested by Dave.

    CC: Dave Chinner <david@fromorbit.com>
    Acked-by: Jan Kara <jack@suse.cz>
    Acked-by: Mel Gorman <mel@csn.ul.ie>
    Signed-off-by: Itaru Kitayama <kitayama@cl.bb4u.ne.jp>
    Signed-off-by: Wu Fengguang <fengguang.wu@intel.com>
    ---
    fs/fs-writeback.c | 11 ++++++-----
    1 file changed, 6 insertions(+), 5 deletions(-)

    --- linux-next.orig/fs/fs-writeback.c 2011-05-24 11:17:17.000000000 +0800
    +++ linux-next/fs/fs-writeback.c 2011-05-24 11:17:18.000000000 +0800
    @@ -672,11 +672,6 @@ static long wb_writeback(struct bdi_writ
    long write_chunk = MAX_WRITEBACK_PAGES;
    struct inode *inode;

    - if (wbc.for_kupdate) {
    - wbc.older_than_this = &oldest_jif;
    - oldest_jif = jiffies -
    - msecs_to_jiffies(dirty_expire_interval * 10);
    - }
    if (!wbc.range_cyclic) {
    wbc.range_start = 0;
    wbc.range_end = LLONG_MAX;
    @@ -723,6 +718,12 @@ static long wb_writeback(struct bdi_writ
    if (work->for_background && !over_bground_thresh())
    break;

    + if (work->for_kupdate) {
    + oldest_jif = jiffies -
    + msecs_to_jiffies(dirty_expire_interval * 10);
    + wbc.older_than_this = &oldest_jif;
    + }
    +
    wbc.more_io = 0;
    wbc.nr_to_write = write_chunk;
    wbc.pages_skipped = 0;



    \
     
     \ /
      Last update: 2011-05-24 07:27    [W:0.025 / U:0.024 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site