From: Jan Kara 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 Signed-off-by: Wu Fengguang --- 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-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/