writeback: schedule periodic writeback with sysctl
authorYafang Shao <laoar.shao@gmail.com>
Mon, 9 Oct 2017 21:44:13 +0000 (05:44 +0800)
committerJens Axboe <axboe@kernel.dk>
Mon, 9 Oct 2017 14:27:40 +0000 (08:27 -0600)
After disable periodic writeback by writing 0 to
dirty_writeback_centisecs, the handler wb_workfn() will not be
entered again until the dirty background limit reaches or
sync syscall is executed or no enough free memory available or
vmscan is triggered.

So the periodic writeback can't be enabled by writing a non-zero
value to dirty_writeback_centisecs.
As it can be disabled by sysctl, it should be able to enable by
sysctl as well.

Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Yafang Shao <laoar.shao@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
mm/page-writeback.c

index 8d1fc593bce8f54aceae26fa6c8b1fde73275f2b..622a18c114caaf1f3dda16d9b6b2dbf9a49f862e 100644 (file)
@@ -1972,8 +1972,14 @@ bool wb_over_bg_thresh(struct bdi_writeback *wb)
 int dirty_writeback_centisecs_handler(struct ctl_table *table, int write,
        void __user *buffer, size_t *length, loff_t *ppos)
 {
-       proc_dointvec(table, write, buffer, length, ppos);
-       return 0;
+       unsigned int old_interval = dirty_writeback_interval;
+       int ret;
+
+       ret = proc_dointvec(table, write, buffer, length, ppos);
+       if (!ret && !old_interval && dirty_writeback_interval)
+               wakeup_flusher_threads(WB_REASON_PERIODIC);
+
+       return ret;
 }
 
 #ifdef CONFIG_BLOCK