xfs
[Top] [All Lists]

RE: [PATCH v2] xfs: improve metadata I/O merging in the elevator

To: "Christoph Hellwig" <hch@xxxxxxxxxxxxx>
Subject: RE: [PATCH v2] xfs: improve metadata I/O merging in the elevator
From: "Alex Elder" <aelder@xxxxxxx>
Date: Tue, 15 Dec 2009 14:12:26 -0600
Cc: <xfs@xxxxxxxxxxx>
In-reply-to: <20091124180315.GB1211@xxxxxxxxxxxxx>
Thread-index: AcptNAc4k6t68waCTmWw3OEespOKNwQjpLWg
Thread-topic: [PATCH v2] xfs: improve metadata I/O merging in the elevator
Christoph Hellwig wrote:
> From: Dave Chinner <dgc@xxxxxxx>
> 
> 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.

Looks good.

> Signed-off-by: Dave Chinner <dgc@xxxxxxx>
> Signed-off-by: Christoph Hellwig <hch@xxxxxx>

Reviewed-by: Alex Elder <aelder@xxxxxxx>

> Index: xfs/fs/xfs/linux-2.6/xfs_buf.c
> ===================================================================
> --- xfs.orig/fs/xfs/linux-2.6/xfs_buf.c       2009-11-16 12:03:21.940253900 
> +0100
> +++ xfs/fs/xfs/linux-2.6/xfs_buf.c    2009-11-16 12:05:54.224256517 +0100
> @@ -1177,10 +1177,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: xfs/fs/xfs/linux-2.6/xfs_buf.h
> ===================================================================
> --- xfs.orig/fs/xfs/linux-2.6/xfs_buf.h       2009-11-16 12:03:21.945261731 
> +0100
> +++ xfs/fs/xfs/linux-2.6/xfs_buf.h    2009-11-16 12:03:23.796003934 +0100
> @@ -55,6 +55,7 @@ typedef enum {
>       XBF_FS_MANAGED = (1 << 8),  /* filesystem controls freeing memory  */
>       XBF_ORDERED = (1 << 11),    /* use ordered writes                  */
>       XBF_READ_AHEAD = (1 << 12), /* asynchronous read-ahead             */
> +     XBF_LOG_BUFFER = (1 << 13), /* this is a buffer used for the log   */
> 
>       /* flags used only as arguments to access routines */
>       XBF_LOCK = (1 << 14),       /* lock requested                      */
> Index: xfs/fs/xfs/xfs_log.c
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_log.c 2009-11-16 12:03:21.952261854 +0100
> +++ xfs/fs/xfs/xfs_log.c      2009-11-16 12:03:23.798003071 +0100
> @@ -1524,6 +1524,7 @@ xlog_sync(xlog_t                *log,
>       XFS_BUF_ZEROFLAGS(bp);
>       XFS_BUF_BUSY(bp);
>       XFS_BUF_ASYNC(bp);
> +     bp->b_flags |= XBF_LOG_BUFFER;
>       /*
>        * Do an ordered write for the log block.
>        * Its unnecessary to flush the first split block in the log wrap case.
> @@ -1561,6 +1562,7 @@ xlog_sync(xlog_t                *log,
>               XFS_BUF_ZEROFLAGS(bp);
>               XFS_BUF_BUSY(bp);
>               XFS_BUF_ASYNC(bp);
> +             bp->b_flags |= XBF_LOG_BUFFER;
>               if (log->l_mp->m_flags & XFS_MOUNT_BARRIER)
>                       XFS_BUF_ORDERED(bp);
>               dptr = XFS_BUF_PTR(bp);
> Index: xfs/include/linux/fs.h
> ===================================================================
> --- xfs.orig/include/linux/fs.h       2009-11-16 12:04:49.799002997 +0100
> +++ xfs/include/linux/fs.h    2009-11-16 12:05:10.130255677 +0100
> @@ -151,6 +151,7 @@ struct inodes_stat_t {
>  #define READ_META    (READ | (1 << BIO_RW_META))
>  #define WRITE_SYNC_PLUG      (WRITE | (1 << BIO_RW_SYNCIO) | (1 << 
> BIO_RW_NOIDLE))
>  #define WRITE_SYNC   (WRITE_SYNC_PLUG | (1 << BIO_RW_UNPLUG))
> +#define WRITE_META   (WRITE | (1 << BIO_RW_META))
>  #define WRITE_ODIRECT        (WRITE | (1 << BIO_RW_SYNCIO) | (1 << 
> BIO_RW_UNPLUG))
>  #define SWRITE_SYNC_PLUG     \
>                       (SWRITE | (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_NOIDLE))
> 
> _______________________________________________
> xfs mailing list
> xfs@xxxxxxxxxxx
> http://oss.sgi.com/mailman/listinfo/xfs

<Prev in Thread] Current Thread [Next in Thread>
  • RE: [PATCH v2] xfs: improve metadata I/O merging in the elevator, Alex Elder <=