From: Jan Kara <jack@xxxxxxx> In case we could not do any writeback for some inodes, trigger next kupdate work early so that writeback on these inodes is not delayed for the whole dirty_writeback_interval. Signed-off-by: Jan Kara <jack@xxxxxxx> Signed-off-by: Wu Fengguang <fengguang.wu@xxxxxxxxx> --- fs/fs-writeback.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) --- linux-next.orig/fs/fs-writeback.c 2011-10-20 22:36:59.000000000 +0800 +++ linux-next/fs/fs-writeback.c 2011-10-20 22:42:24.000000000 +0800 @@ -886,7 +886,7 @@ static long wb_check_old_data_flush(stru expired = wb->last_old_flush + msecs_to_jiffies(dirty_writeback_interval * 10); - if (time_before(jiffies, expired)) + if (time_before(jiffies, expired) && list_empty(&wb->b_more_io_wait)) return 0; wb->last_old_flush = jiffies; @@ -958,6 +958,10 @@ int bdi_writeback_thread(void *data) struct bdi_writeback *wb = data; struct backing_dev_info *bdi = wb->bdi; long progress; + unsigned int pause = 1; + unsigned int max_pause = dirty_writeback_interval ? + msecs_to_jiffies(dirty_writeback_interval * 10) : + HZ; current->flags |= PF_SWAPWRITE; set_freezable(); @@ -979,8 +983,10 @@ int bdi_writeback_thread(void *data) progress = wb_do_writeback(wb, 0); - if (progress) + if (progress) { wb->last_active = jiffies; + pause = 1; + } set_current_state(TASK_INTERRUPTIBLE); if (!list_empty(&bdi->work_list) || kthread_should_stop()) { @@ -988,8 +994,11 @@ int bdi_writeback_thread(void *data) continue; } - if (wb_has_dirty_io(wb) && dirty_writeback_interval) - schedule_timeout(msecs_to_jiffies(dirty_writeback_interval * 10)); + if (!list_empty(&wb->b_more_io_wait) && pause < max_pause) { + schedule_timeout(pause); + pause <<= 1; + } else if (wb_has_dirty_io(wb) && dirty_writeback_interval) + schedule_timeout(max_pause); else { /* * We have nothing to do, so can go sleep without any -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html