[PATCH, RFC] ext4: Fix use of write barrier in commit logic

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Theodore Tso
Date: Monday, May 19, 2008 - 7:51 pm

On Mon, May 19, 2008 at 10:46:54AM -0400, Theodore Tso wrote:

And here it is.... 

Comments, please.  And Eric, if you have a chance to benchmark this to
see how this patch works out, comparing "barrier=0, "barrier=1", and
"barrier=1,journal_async_commit", as we had discussed earlier on the
ext4, I'd be very much obliged.

As I mentioned earlier, adding blkdev_issue_flush() to ext[34]/fsync.c
is I believe not necessary.  We should be doing the right thing in the
commit.c file.  In the future, if we want some extra bonus points, in
the case where writes have taken place to the inode, but no metadata
operations have taken place (the common case when a database is
writing to a pre-existing tablespace), it would be nice if fsync()
could notice this case, force out the datablocks the old-fashioned way
without forcing an journal commit, and then calling
blkdev_issue_flush().  That should give us some nice performance wins
for database workloads; unfortunately it probably won't do us any good
on mailserver workloads.

Regards,

						- Ted

From ce99d82266d003e9b2284a1f46bd6f0e3a87c066 Mon Sep 17 00:00:00 2001
From: Theodore Ts'o <tytso@mit.edu>
Date: Mon, 19 May 2008 22:40:52 -0400
Subject: [PATCH] ext4: Fix use of write barrier in commit logic

We were previously using set_buffer_ordered() and then calling
submit_bh() to write the commit block, which resulted in this flush
behavior:

write log blocks
blkdev_issue_flush()	// flush #1
write commit block
blkdev_issue_flush()	// flush #2
write metadata blocks

And if the journal_async_commit mount option was used, the commit was
written without using set_buffer_ordered(), which resulted in no
flushes happening at all.

Change the commit code to use blkdev_issue_flush() explicitly, and to
omit flush #1 if journal_async_commit is enabled, but to always
perform the second flush if write barriers are enabled.

This change should hopefully reduce the overhead of using write
barriers when an ext4 filesystem is mounted using
"barrier=1,journal_async_commit", while still maintaining filesystem
safety.  If this works out, we should probably make this the default
mode for ext4.

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
---
 fs/jbd2/commit.c |   44 +++++++++++++++++---------------------------
 1 files changed, 17 insertions(+), 27 deletions(-)

diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c
index 3041d75..3fe5be5 100644
--- a/fs/jbd2/commit.c
+++ b/fs/jbd2/commit.c
@@ -22,6 +22,7 @@
 #include <linux/pagemap.h>
 #include <linux/jiffies.h>
 #include <linux/crc32.h>
+#include <linux/blkdev.h>
 
 /*
  * Default IO end handler for temporary BJ_IO buffer_heads.
@@ -111,7 +112,6 @@ static int journal_submit_commit_record(journal_t *journal,
 	struct commit_header *tmp;
 	struct buffer_head *bh;
 	int ret;
-	int barrier_done = 0;
 	struct timespec now = current_kernel_time();
 
 	if (is_journal_aborted(journal))
@@ -147,34 +147,24 @@ static int journal_submit_commit_record(journal_t *journal,
 	if (journal->j_flags & JBD2_BARRIER &&
 		!JBD2_HAS_INCOMPAT_FEATURE(journal,
 					 JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) {
-		set_buffer_ordered(bh);
-		barrier_done = 1;
+		ret = blkdev_issue_flush(bh->b_bdev, NULL);
+		if (ret == -EOPNOTSUPP) {
+			char b[BDEVNAME_SIZE];
+
+			printk(KERN_WARNING
+			       "JBD: barrier-based sync failed on %s - "
+			       "disabling barriers\n",
+			       bdevname(journal->j_dev, b));
+			spin_lock(&journal->j_state_lock);
+			journal->j_flags &= ~JBD2_BARRIER;
+			spin_unlock(&journal->j_state_lock);
+		}
 	}
 	ret = submit_bh(WRITE, bh);
-	if (barrier_done)
-		clear_buffer_ordered(bh);
 
-	/* is it possible for another commit to fail at roughly
-	 * the same time as this one?  If so, we don't want to
-	 * trust the barrier flag in the super, but instead want
-	 * to remember if we sent a barrier request
-	 */
-	if (ret == -EOPNOTSUPP && barrier_done) {
-		char b[BDEVNAME_SIZE];
-
-		printk(KERN_WARNING
-			"JBD: barrier-based sync failed on %s - "
-			"disabling barriers\n",
-			bdevname(journal->j_dev, b));
-		spin_lock(&journal->j_state_lock);
-		journal->j_flags &= ~JBD2_BARRIER;
-		spin_unlock(&journal->j_state_lock);
+	if (!ret && journal->j_flags & JBD2_BARRIER)
+		ret = blkdev_issue_flush(bh->b_bdev, NULL);
 
-		/* And try again, without the barrier */
-		set_buffer_uptodate(bh);
-		set_buffer_dirty(bh);
-		ret = submit_bh(WRITE, bh);
-	}
 	*cbh = bh;
 	return ret;
 }
-- 
1.5.4.1.144.gdfee-dirty

--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH 0/4] (RESEND) ext3[34] barrier changes, Eric Sandeen, (Fri May 16, 12:02 pm)
[PATCH 1/4] ext3: enable barriers by default, Eric Sandeen, (Fri May 16, 12:05 pm)
[PATCH 2/4] ext3: call blkdev_issue_flush on fsync, Eric Sandeen, (Fri May 16, 12:07 pm)
[PATCH 3/4] ext4: enable barriers by default, Eric Sandeen, (Fri May 16, 12:08 pm)
[PATCH 4/4] ext4: call blkdev_issue_flush on fsync, Eric Sandeen, (Fri May 16, 12:09 pm)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Andrew Morton, (Fri May 16, 1:05 pm)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Eric Sandeen, (Fri May 16, 1:53 pm)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Andrew Morton, (Fri May 16, 1:58 pm)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Jamie Lokier, (Fri May 16, 2:45 pm)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Eric Sandeen, (Fri May 16, 3:03 pm)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Jamie Lokier, (Fri May 16, 3:03 pm)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Jamie Lokier, (Fri May 16, 3:09 pm)
Re: [PATCH 2/4] ext3: call blkdev_issue_flush on fsync, Jamie Lokier, (Fri May 16, 3:15 pm)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Eric Sandeen, (Fri May 16, 3:21 pm)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Jamie Lokier, (Fri May 16, 3:30 pm)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Jamie Lokier, (Fri May 16, 3:53 pm)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Theodore Tso, (Fri May 16, 5:20 pm)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Andrew Morton, (Fri May 16, 5:35 pm)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Theodore Tso, (Sat May 17, 6:43 am)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Andreas Dilger, (Sat May 17, 10:59 am)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Theodore Tso, (Sat May 17, 1:44 pm)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Chris Mason, (Sat May 17, 5:48 pm)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Theodore Tso, (Sat May 17, 6:36 pm)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Ric Wheeler, (Sun May 18, 7:49 am)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Andi Kleen, (Sun May 18, 12:54 pm)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Andi Kleen, (Sun May 18, 1:03 pm)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Theodore Tso, (Sun May 18, 5:28 pm)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Theodore Tso, (Sun May 18, 5:43 pm)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Eric Sandeen, (Sun May 18, 7:29 pm)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Andrew Morton, (Sun May 18, 9:11 pm)
Re: [PATCH 1/4] ext3: enable barriers by default, Pavel Machek, (Mon May 19, 1:58 am)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Pavel Machek, (Mon May 19, 2:04 am)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Chris Mason, (Mon May 19, 6:26 am)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Theodore Tso, (Mon May 19, 7:46 am)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Chris Mason, (Mon May 19, 10:16 am)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Chris Mason, (Mon May 19, 11:39 am)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Jan Kara, (Mon May 19, 3:39 pm)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Chris Mason, (Mon May 19, 5:29 pm)
Re: [PATCH 4/4] ext4: call blkdev_issue_flush on fsync, Theodore Tso, (Mon May 19, 7:34 pm)
[PATCH, RFC] ext4: Fix use of write barrier in commit logic, Theodore Tso, (Mon May 19, 7:51 pm)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Timothy Shimmin, (Mon May 19, 8:29 pm)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Jens Axboe, (Tue May 20, 1:25 am)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Chris Mason, (Tue May 20, 5:04 am)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Chris Mason, (Tue May 20, 5:17 am)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Jamie Lokier, (Tue May 20, 7:42 am)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Jamie Lokier, (Tue May 20, 7:45 am)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Jamie Lokier, (Tue May 20, 7:58 am)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Jamie Lokier, (Tue May 20, 8:13 am)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Jamie Lokier, (Tue May 20, 8:36 am)
Re: [PATCH 4/4] ext4: call blkdev_issue_flush on fsync, Jamie Lokier, (Tue May 20, 8:43 am)
Re: [PATCH 4/4] ext4: call blkdev_issue_flush on fsync, Eric Sandeen, (Tue May 20, 8:52 am)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Chris Mason, (Tue May 20, 9:02 am)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Jamie Lokier, (Tue May 20, 9:27 am)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Chris Mason, (Tue May 20, 10:08 am)
Re: [PATCH 4/4] ext4: call blkdev_issue_flush on fsync, Jens Axboe, (Tue May 20, 12:54 pm)
Re: [PATCH 4/4] ext4: call blkdev_issue_flush on fsync, Jamie Lokier, (Tue May 20, 3:02 pm)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Jamie Lokier, (Tue May 20, 3:26 pm)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Jamie Lokier, (Tue May 20, 4:35 pm)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Jamie Lokier, (Tue May 20, 4:44 pm)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Jamie Lokier, (Tue May 20, 4:48 pm)
Re: [PATCH 4/4] ext4: call blkdev_issue_flush on fsync, Jens Axboe, (Wed May 21, 12:30 am)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Pavel Machek, (Wed May 21, 4:22 am)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Theodore Tso, (Wed May 21, 5:32 am)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Andrew Morton, (Wed May 21, 11:03 am)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Eric Sandeen, (Wed May 21, 11:15 am)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Theodore Tso, (Wed May 21, 11:29 am)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Andrew Morton, (Wed May 21, 11:49 am)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Jamie Lokier, (Wed May 21, 12:36 pm)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Chris Mason, (Wed May 21, 12:40 pm)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Jamie Lokier, (Wed May 21, 12:42 pm)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Jamie Lokier, (Wed May 21, 12:43 pm)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Jamie Lokier, (Wed May 21, 12:54 pm)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Greg Smith, (Wed May 21, 1:25 pm)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Daniel Phillips, (Wed May 21, 3:30 pm)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Ric Wheeler, (Fri May 23, 11:33 am)
Re: [PATCH 0/4] (RESEND) ext3[34] barrier changes, Eric Sandeen, (Thu May 29, 6:36 am)