Linux filesystem development
 help / color / mirror / Atom feed
* [PATCH v3 1/2] writeback: Wake up waiting tasks when finishing the writeback of a chunk.
@ 2025-09-30  6:56 Julian Sun
  2025-09-30  7:18 ` [PATCH v3 2/2] writeback: Add logging for slow writeback (exceeds sysctl_hung_task_timeout_secs) Julian Sun
                   ` (2 more replies)
  0 siblings, 3 replies; 11+ messages in thread
From: Julian Sun @ 2025-09-30  6:56 UTC (permalink / raw)
  To: linux-fsdevel; +Cc: viro, brauner, jack

Writing back a large number of pages can take a lots of time.
This issue is exacerbated when the underlying device is slow or
subject to block layer rate limiting, which in turn triggers
unexpected hung task warnings.

We can trigger a wake-up once a chunk has been written back and the
waiting time for writeback exceeds half of
sysctl_hung_task_timeout_secs.
This action allows the hung task detector to be aware of the writeback
progress, thereby eliminating these unexpected hung task warnings.

This patch has passed the xfstests 'check -g quick' test based on ext4,
with no additional failures introduced.

Signed-off-by: Julian Sun <sunjunchao@bytedance.com>
Suggested-by: Peter Zijlstra <peterz@infradead.org>
Reviewed-by: Jan Kara <jack@suse.cz>
---
 Changes in v2:
  * remove code in finish_writeback_work()
  * rename stamp to progress_stamp
  * only report progress if there's any task waiting


 fs/fs-writeback.c                | 11 ++++++++++-
 include/linux/backing-dev-defs.h |  1 +
 2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c
index a07b8cf73ae2..61785a9d6669 100644
--- a/fs/fs-writeback.c
+++ b/fs/fs-writeback.c
@@ -14,6 +14,7 @@
  *		Additions for address_space-based writeback
  */
 
+#include <linux/sched/sysctl.h>
 #include <linux/kernel.h>
 #include <linux/export.h>
 #include <linux/spinlock.h>
@@ -213,7 +214,8 @@ static void wb_queue_work(struct bdi_writeback *wb,
 void wb_wait_for_completion(struct wb_completion *done)
 {
 	atomic_dec(&done->cnt);		/* put down the initial count */
-	wait_event(*done->waitq, !atomic_read(&done->cnt));
+	wait_event(*done->waitq,
+		   ({ done->progress_stamp = jiffies; !atomic_read(&done->cnt); }));
 }
 
 #ifdef CONFIG_CGROUP_WRITEBACK
@@ -1893,6 +1895,7 @@ static long writeback_sb_inodes(struct super_block *sb,
 	long write_chunk;
 	long total_wrote = 0;  /* count both pages and inodes */
 	unsigned long dirtied_before = jiffies;
+	unsigned long progress_stamp;
 
 	if (work->for_kupdate)
 		dirtied_before = jiffies -
@@ -1975,6 +1978,12 @@ static long writeback_sb_inodes(struct super_block *sb,
 		 */
 		__writeback_single_inode(inode, &wbc);
 
+		/* Report progress to inform the hung task detector of the progress. */
+		progress_stamp = work->done->progress_stamp;
+		if (work->done && progress_stamp && (jiffies - progress_stamp) >
+		    HZ * sysctl_hung_task_timeout_secs / 2)
+			wake_up_all(work->done->waitq);
+
 		wbc_detach_inode(&wbc);
 		work->nr_pages -= write_chunk - wbc.nr_to_write;
 		wrote = write_chunk - wbc.nr_to_write - wbc.pages_skipped;
diff --git a/include/linux/backing-dev-defs.h b/include/linux/backing-dev-defs.h
index 2ad261082bba..1057060bb2aa 100644
--- a/include/linux/backing-dev-defs.h
+++ b/include/linux/backing-dev-defs.h
@@ -63,6 +63,7 @@ enum wb_reason {
 struct wb_completion {
 	atomic_t		cnt;
 	wait_queue_head_t	*waitq;
+	unsigned long progress_stamp;	/* The jiffies when slow progress is detected */
 };
 
 #define __WB_COMPLETION_INIT(_waitq)	\
-- 
2.39.5


^ permalink raw reply related	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2025-10-10 11:28 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-30  6:56 [PATCH v3 1/2] writeback: Wake up waiting tasks when finishing the writeback of a chunk Julian Sun
2025-09-30  7:18 ` [PATCH v3 2/2] writeback: Add logging for slow writeback (exceeds sysctl_hung_task_timeout_secs) Julian Sun
2025-09-30  7:31   ` Jan Kara
2025-10-06 10:44   ` (subset) " Christian Brauner
2025-09-30  8:53 ` [PATCH v3 1/2] writeback: Wake up waiting tasks when finishing the writeback of a chunk Julian Sun
2025-09-30  8:59   ` Jan Kara
2025-10-06 10:44 ` (subset) " Christian Brauner
2025-10-06 14:29   ` [External] " Julian Sun
2025-10-07 14:37     ` Julian Sun
2025-10-10 11:10       ` Christian Brauner
2025-10-10 11:28         ` Julian Sun

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox