lkml.org 
[lkml]   [2010]   [Jul]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC][PATCH 09/16] writeback: do not lose wake-ups in bdi threads
    Date
    From: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>

    The bdi threads ('bdi_writeback_thread()') can lose wake-ups if,
    for example, 'bdi_queue_work()' is executed while after the bdi
    thread finished 'wb_do_writeback()' but before it has called
    'schedule_timeout_interruptible()'.

    To fix this issue, we have to check whether we have works to
    process after we change the task state to 'TASK_INTERRUPTIBLE'.

    Also, 'bdi_writeback_thread()' inconsistently handles the cases
    when 'dirty_writeback_interval' is zero and non-zero. But there is
    no fundamental difference between these cases, so they have to be
    handled the same way, which this patch also does.

    This patch also removes strange 'list_empty_careful()' call.

    Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
    ---
    fs/fs-writeback.c | 17 +++++++++--------
    1 files changed, 9 insertions(+), 8 deletions(-)

    diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c
    index 3fc5194..f045450 100644
    --- a/fs/fs-writeback.c
    +++ b/fs/fs-writeback.c
    @@ -848,17 +848,18 @@ int bdi_writeback_thread(void *data)
    break;
    }

    - if (dirty_writeback_interval) {
    - wait_jiffies = msecs_to_jiffies(dirty_writeback_interval * 10);
    - schedule_timeout_interruptible(wait_jiffies);
    - } else {
    - set_current_state(TASK_INTERRUPTIBLE);
    - if (list_empty_careful(&wb->bdi->work_list) &&
    - !kthread_should_stop())
    - schedule();
    + set_current_state(TASK_INTERRUPTIBLE);
    + if (!list_empty(&bdi->work_list)) {
    __set_current_state(TASK_RUNNING);
    + continue;
    }

    + if (dirty_writeback_interval) {
    + wait_jiffies = msecs_to_jiffies(dirty_writeback_interval * 10);
    + schedule_timeout(wait_jiffies);
    + } else
    + schedule();
    +
    try_to_freeze();
    }

    --
    1.7.1.1


    \
     
     \ /
      Last update: 2010-07-16 14:53    [W:0.021 / U:30.356 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site