Unverified Commit d6e62159 authored by Julian Sun's avatar Julian Sun Committed by Christian Brauner
Browse files

writeback: Add logging for slow writeback (exceeds sysctl_hung_task_timeout_secs)



When a writeback work lasts for sysctl_hung_task_timeout_secs, we want
to identify that there are tasks waiting for a long time-this helps us
pinpoint potential issues.

Additionally, recording the starting jiffies is useful when debugging a
crashed vmcore.

Signed-off-by: default avatarJulian Sun <sunjunchao@bytedance.com>
Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
parent 18886355
Loading
Loading
Loading
Loading
+15 −2
Original line number Diff line number Diff line
@@ -201,6 +201,19 @@ static void wb_queue_work(struct bdi_writeback *wb,
	spin_unlock_irq(&wb->work_lock);
}

static bool wb_wait_for_completion_cb(struct wb_completion *done)
{
	unsigned long waited_secs = (jiffies - done->wait_start) / HZ;

	done->progress_stamp = jiffies;
	if (waited_secs > sysctl_hung_task_timeout_secs)
		pr_info("INFO: The task %s:%d has been waiting for writeback "
			"completion for more than %lu seconds.",
			current->comm, current->pid, waited_secs);

	return !atomic_read(&done->cnt);
}

/**
 * wb_wait_for_completion - wait for completion of bdi_writeback_works
 * @done: target wb_completion
@@ -213,9 +226,9 @@ static void wb_queue_work(struct bdi_writeback *wb,
 */
void wb_wait_for_completion(struct wb_completion *done)
{
	done->wait_start = jiffies;
	atomic_dec(&done->cnt);		/* put down the initial count */
	wait_event(*done->waitq,
		   ({ done->progress_stamp = jiffies; !atomic_read(&done->cnt); }));
	wait_event(*done->waitq, wb_wait_for_completion_cb(done));
}

#ifdef CONFIG_CGROUP_WRITEBACK
+1 −0
Original line number Diff line number Diff line
@@ -64,6 +64,7 @@ struct wb_completion {
	atomic_t		cnt;
	wait_queue_head_t	*waitq;
	unsigned long progress_stamp;	/* The jiffies when slow progress is detected */
	unsigned long wait_start;	/* The jiffies when waiting for the writeback work to finish */
};

#define __WB_COMPLETION_INIT(_waitq)	\