From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751931AbdJFPLs (ORCPT ); Fri, 6 Oct 2017 11:11:48 -0400 Received: from mail-pf0-f196.google.com ([209.85.192.196]:34710 "EHLO mail-pf0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751487AbdJFPLr (ORCPT ); Fri, 6 Oct 2017 11:11:47 -0400 X-Google-Smtp-Source: AOwi7QCJmmL/w0C19P/Lk1G9r4hnI1TtEQvoeFqklDJJFF/xxKdaGJOrIP9WJybug/828BFzH+Wkbg== From: Yafang Shao To: akpm@linux-foundation.org, jack@suse.cz, mhocko@suse.com, hannes@cmpxchg.org, vdavydov.dev@gmail.com, jlayton@redhat.com, nborisov@suse.com, tytso@mit.edu, mawilcox@microsoft.com Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, laoar.shao@gmail.com Subject: [PATCH] mm/page-writeback.c: fix bug caused by disable periodic writeback Date: Sat, 7 Oct 2017 06:58:04 +0800 Message-Id: <1507330684-2205-1-git-send-email-laoar.shao@gmail.com> X-Mailer: git-send-email 1.8.3.1 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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. Signed-off-by: Yafang Shao --- mm/page-writeback.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/mm/page-writeback.c b/mm/page-writeback.c index 0b9c5cb..e202f37 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -1972,7 +1972,13 @@ 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); + 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(0, WB_REASON_PERIODIC); + return 0; } -- 1.8.3.1