: Reduce Log I/O latency
PATCH 2/9 : Reduce Log I/O latency
Reduce log I/O latency
To ensure that log I/O is issued as the highest priority I/O, set the I/O priority of the log I/O to the highest possible. This will ensure that log I/O is not held up behind bulk data or other metadata I/O as delaying log I/O can pause the entire transaction subsystem. Introduce a new buffer flag to allow us to tag the log buffers so we can discrimiate when issuing the I/O.
Signed-off-by Dave Chinner <[email protected]>
--- fs/xfs/linux-2.6/xfs_buf.c | 3 +++ fs/xfs/linux-2.6/xfs_buf.h | 5 ++++- fs/xfs/xfs_log.c | 2 ++ 3 files changed, 9 insertions(+), 1 deletion(-)
fs/xfs/linux-2.6/xfs_buf.c +3 -0
@@ -1255,6 +1255,9 @@ next_chunk: submit_io:if (likely (bio->bi_size)) { +/* log I/O should not be delayed by anything. */ +if (bp->b_flags &XBF_LOG_BUFFER ) +bio_set_prio (bio,IOPRIO_PRIO_VALUE (IOPRIO_CLASS_RT ,0 ));submit_bio (rw, bio);if (size) goto next_chunk;
fs/xfs/linux-2.6/xfs_buf.h +4 -1
@@ -53,7 +53,8 @@ typedef enum {XBF_DELWRI = (1 <<6 ),/* buffer has dirty pages */ XBF_STALE = (1 <<7 ),/* buffer has been staled, do not find it */ XBF_FS_MANAGED = (1 <<8 ),/* filesystem controls freeing memory */ -XBF_ORDERED = (1 <<11 ),/* use ordered writes */ +XBF_LOG_BUFFER = (1 <<9 ),/* Buffer issued by the log */ +XBF_ORDERED = (1 <<11 ),/* use ordered writes */ XBF_READ_AHEAD = (1 <<12 ),/* asynchronous read-ahead */ /* flags used only as arguments to access routines */
@@ -340,6 +341,8 @@ extern void xfs_buf_trace(xfs_buf_t *, c#define XFS_BUF_TARGET (bp) ((bp)->b_target)#define XFS_BUFTARG_NAME (target) xfs_buf_target_name(target) +#define XFS_BUF_SET_LOGBUF (bp) ((bp)->b_flags |= XBF_LOG_BUFFER) +static inline int xfs_bawrite (void *mp,xfs_buf_t *bp) { bp->b_fspriv3 = mp;
fs/xfs/xfs_log.c +2 -0
@@ -1443,6 +1443,8 @@ xlog_sync(xlog_t *log,XFS_BUF_ZEROFLAGS (bp);XFS_BUF_BUSY (bp);XFS_BUF_ASYNC (bp); +XFS_BUF_SET_LOGBUF (bp); +/* * Do an ordered write for the log block. * Its unnecessary to flush the first split block in the log wrap case.
fs/xfs/xfs_log.c xlog_sync(xlog_t *log, · line 1450
Quoted 13 lines
Index:
2.6.x-xfs-new/fs/xfs/xfs_log.c
===================================================================fs/xfs/xfs_log.c +2
-0@@ -1443,6 +1443,8 @@ xlog_sync(xlog_t *log,XFS_BUF_ZEROFLAGS (bp);XFS_BUF_BUSY (bp);XFS_BUF_ASYNC (bp); +XFS_BUF_SET_LOGBUF (bp); +/* * Do an ordered write for the log block. * Its unnecessary to flush the first split block in the log wrap case.
Whichever way you go with this one Dave you should probably add another XFS_BUF_SET_LOGBUF() call for the buffer split case further down in the same function.