From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: with ECARTIS (v1.0.0; list xfs); Mon, 21 Jan 2008 19:47:25 -0800 (PST) Received: from larry.melbourne.sgi.com (larry.melbourne.sgi.com [134.14.52.130]) by oss.sgi.com (8.12.11.20060308/8.12.11/SuSE Linux 0.7) with SMTP id m0M3lERF032756 for ; Mon, 21 Jan 2008 19:47:19 -0800 Message-ID: <47956818.1010808@sgi.com> Date: Tue, 22 Jan 2008 14:50:48 +1100 From: Lachlan McIlroy Reply-To: lachlan@sgi.com MIME-Version: 1.0 Subject: Re: [patch] Use BIO_META tags for metadata rather than BIO_SYNC References: <20080121041826.GB155259@sgi.com> In-Reply-To: <20080121041826.GB155259@sgi.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com List-Id: xfs To: David Chinner Cc: xfs-dev , xfs-oss Looks good. David Chinner wrote: > Improve metadata I/O merging in the elevator > > Change all async metadata buffers to use [READ|WRITE]_META I/O types > so that the I/O doesn't get issued immediately. This allows merging > of adjacent metadata requests but still prioritises them over bulk > data. This shows a 10-15% improvement in sequential create speed of > small files. > > Don't include the log buffers in this classification - leave them > as sync types so they are issued immediately. > > Signed-off-by: Dave Chinner > --- > fs/xfs/linux-2.6/xfs_buf.c | 6 +++++- > include/linux/fs.h | 1 + > 2 files changed, 6 insertions(+), 1 deletion(-) > > Index: 2.6.x-xfs-new/fs/xfs/linux-2.6/xfs_buf.c > =================================================================== > --- 2.6.x-xfs-new.orig/fs/xfs/linux-2.6/xfs_buf.c 2007-12-19 11:56:47.977477993 +1100 > +++ 2.6.x-xfs-new/fs/xfs/linux-2.6/xfs_buf.c 2007-12-19 11:56:52.200932303 +1100 > @@ -1136,10 +1136,14 @@ _xfs_buf_ioapply( > if (bp->b_flags & XBF_ORDERED) { > ASSERT(!(bp->b_flags & XBF_READ)); > rw = WRITE_BARRIER; > - } else if (bp->b_flags & _XBF_RUN_QUEUES) { > + } else if (bp->b_flags & XBF_LOG_BUFFER) { > ASSERT(!(bp->b_flags & XBF_READ_AHEAD)); > bp->b_flags &= ~_XBF_RUN_QUEUES; > rw = (bp->b_flags & XBF_WRITE) ? WRITE_SYNC : READ_SYNC; > + } else if (bp->b_flags & _XBF_RUN_QUEUES) { > + ASSERT(!(bp->b_flags & XBF_READ_AHEAD)); > + bp->b_flags &= ~_XBF_RUN_QUEUES; > + rw = (bp->b_flags & XBF_WRITE) ? WRITE_META : READ_META; > } else { > rw = (bp->b_flags & XBF_WRITE) ? WRITE : > (bp->b_flags & XBF_READ_AHEAD) ? READA : READ; > Index: 2.6.x-xfs-new/include/linux/fs.h > =================================================================== > --- 2.6.x-xfs-new.orig/include/linux/fs.h 2007-12-19 01:11:16.495229881 +1100 > +++ 2.6.x-xfs-new/include/linux/fs.h 2007-12-19 11:56:52.352912667 +1100 > @@ -83,6 +83,7 @@ extern int dir_notify_enable; > #define READ_SYNC (READ | (1 << BIO_RW_SYNC)) > #define READ_META (READ | (1 << BIO_RW_META)) > #define WRITE_SYNC (WRITE | (1 << BIO_RW_SYNC)) > +#define WRITE_META (WRITE | (1 << BIO_RW_META)) > #define WRITE_BARRIER ((1 << BIO_RW) | (1 << BIO_RW_BARRIER)) > > #define SEL_IN 1 > > >