All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael L. Semon" <mlsemon35@gmail.com>
To: "xfs@oss.sgi.com" <xfs@oss.sgi.com>
Subject: [RFC] xfs: remedy small writes during wrapped-log recovery
Date: Fri, 09 Jan 2015 15:02:53 -0500	[thread overview]
Message-ID: <54B033ED.9010805@gmail.com> (raw)

Hi!  I like this patch and am confident with it on x86.  However,
a) it has no x86_64 coverage; and b) xfstests xfs/306 in particular
emits more of this output:

    buffer_io_error: nnnn callbacks suppressed

Might someone evaluate this patch or the intent of the patch?

The intent:

For XFS filesystems that don't change much, such as the /boot and
alternate / partitions here, mount times were about 17s instead of
0.4s while the log is in a wrapped state, write caches off.  This 
patch fixes the issue on v4- and v5-superblock XFS filesystems.

xfs_repair can solve this issue short-term and also cut wrapped-log 
mount time in half short-term for v5 file systems.  Don't know if 
that's a mkfs.xfs issue or just coincidence.

A bisect still needs to be done to determine when the slow mount 
behavior started.  It could very well be that somebody fixed the 
buffer_io_error messages that I saw long ago, and the solution made 
some mounts here rather miserable.

Thanks!

Michael

The patch:

xlog_write_log_records() has an algorithm to "Greedily allocate a
buffer big enough...," starting with ffs(blocks), adding two sensible
checks, and then feeding it to a loop with checks of its own.

However, when blocks is an odd number, the number that becomes nbblks
to the xlog_bwrite() function ends up being 2 (1 << 1).  The most
obvious effect is that when the log wraps, a write of two odd-sized
log regions on an 8-GB XFS filesystem will take around 2049 calls 
to xlog_bwrite() instead of the "two separate I/Os" suggested in
xlog_clear_stale_blocks().

Fix this by changing the ffs(blocks) to fls(blocks).

There is a similar ffs(blocks) check in xlog_find_verify_cycle().
This was not investigated.

Signed-off-by: Michael L. Semon <mlsemon35@gmail.com>
---
 fs/xfs/xfs_log_recover.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c
index a5a945f..13381eb 100644
--- a/fs/xfs/xfs_log_recover.c
+++ b/fs/xfs/xfs_log_recover.c
@@ -1242,7 +1242,7 @@ xlog_write_log_records(
 	 * a smaller size.  We need to be able to write at least a
 	 * log sector, or we're out of luck.
 	 */
-	bufblks = 1 << ffs(blocks);
+	bufblks = 1 << fls(blocks);
 	while (bufblks > log->l_logBBsize)
 		bufblks >>= 1;
 	while (!(bp = xlog_get_bp(log, bufblks))) {
-- 
1.8.4

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

             reply	other threads:[~2015-01-09 20:03 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-09 20:02 Michael L. Semon [this message]
2015-01-12  1:04 ` [RFC] xfs: remedy small writes during wrapped-log recovery Michael L. Semon
2015-01-12 15:30 ` Brian Foster
2015-01-13 14:23   ` Michael L. Semon
2015-01-13 17:11     ` Brian Foster

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=54B033ED.9010805@gmail.com \
    --to=mlsemon35@gmail.com \
    --cc=xfs@oss.sgi.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.