summaryrefslogtreecommitdiffstats
path: root/fs/jbd2/commit.c
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2016-10-28 12:58:12 -0400
committerIngo Molnar <mingo@kernel.org>2017-01-14 05:30:06 -0500
commit6fa7aa50b2c48400bbd045daf3a2498882eb0596 (patch)
treec4b5c8a06b1afe29d19dc73298b91388ee55f49d /fs/jbd2/commit.c
parent1460cb65a10f6c7a6e3a1c76513338861a0a43b6 (diff)
fs/jbd2, locking/mutex, sched/wait: Use mutex_lock_io() for journal->j_checkpoint_mutex
When an ext4 fs is bogged down by a lot of metadata IOs (in the reported case, it was deletion of millions of files, but any massive amount of journal writes would do), after the journal is filled up, tasks which try to access the filesystem and aren't currently performing the journal writes end up waiting in __jbd2_log_wait_for_space() for journal->j_checkpoint_mutex. Because those mutex sleeps aren't marked as iowait, this condition can lead to misleadingly low iowait and /proc/stat:procs_blocked. While iowait propagation is far from strict, this condition can be triggered fairly easily and annotating these sleeps correctly helps initial diagnosis quite a bit. Use the new mutex_lock_io() for journal->j_checkpoint_mutex so that these sleeps are properly marked as iowait. Reported-by: Mingbo Wan <mingbo@fb.com> Signed-off-by: Tejun Heo <tj@kernel.org> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Andreas Dilger <adilger.kernel@dilger.ca> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Jan Kara <jack@suse.com> Cc: Jens Axboe <axboe@kernel.dk> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Mike Galbraith <efault@gmx.de> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Theodore Ts'o <tytso@mit.edu> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: kernel-team@fb.com Link: http://lkml.kernel.org/r/1477673892-28940-5-git-send-email-tj@kernel.org Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'fs/jbd2/commit.c')
-rw-r--r--fs/jbd2/commit.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c
index 8c514367ba5a..b6b194ec1b4f 100644
--- a/fs/jbd2/commit.c
+++ b/fs/jbd2/commit.c
@@ -393,7 +393,7 @@ void jbd2_journal_commit_transaction(journal_t *journal)
393 /* Do we need to erase the effects of a prior jbd2_journal_flush? */ 393 /* Do we need to erase the effects of a prior jbd2_journal_flush? */
394 if (journal->j_flags & JBD2_FLUSHED) { 394 if (journal->j_flags & JBD2_FLUSHED) {
395 jbd_debug(3, "super block updated\n"); 395 jbd_debug(3, "super block updated\n");
396 mutex_lock(&journal->j_checkpoint_mutex); 396 mutex_lock_io(&journal->j_checkpoint_mutex);
397 /* 397 /*
398 * We hold j_checkpoint_mutex so tail cannot change under us. 398 * We hold j_checkpoint_mutex so tail cannot change under us.
399 * We don't need any special data guarantees for writing sb 399 * We don't need any special data guarantees for writing sb