xfs
[Top] [All Lists]

[PATCH RFC v3 2/2] xfs: split metadata and log buffer completion to sepa

To: xfs@xxxxxxxxxxx
Subject: [PATCH RFC v3 2/2] xfs: split metadata and log buffer completion to separate workqueues
From: Brian Foster <bfoster@xxxxxxxxxx>
Date: Thu, 13 Nov 2014 14:24:01 -0500
Delivered-to: xfs@xxxxxxxxxxx
In-reply-to: <1415906641-43587-1-git-send-email-bfoster@xxxxxxxxxx>
References: <1415906641-43587-1-git-send-email-bfoster@xxxxxxxxxx>
XFS traditionally sends all buffer I/O completion work to a single
queue. This includes metadata buffer completion and log buffer
completion. The log buffer completion requires a high priority queue to
prevent stalls due to log forces getting stuck behind other queued work.

Rather than continue to prioritize all buffer I/O completion due to the
needs of log completion, split log buffer completion off to
m_log_workqueue and move the high priority flag from m_buf_workqueue to
m_log_workqueue.

[XXX: Use of XBF_SYNCIO is purely for demonstration. Define a new flag.]

Signed-off-by: Brian Foster <bfoster@xxxxxxxxxx>
---
 fs/xfs/xfs_buf.c   | 9 ++++++++-
 fs/xfs/xfs_super.c | 5 ++---
 2 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c
index c06d790..58d729c 100644
--- a/fs/xfs/xfs_buf.c
+++ b/fs/xfs/xfs_buf.c
@@ -1050,8 +1050,15 @@ void
 xfs_buf_ioend_async(
        struct xfs_buf  *bp)
 {
+       struct workqueue_struct *wq;
+
+       if (bp->b_flags & XBF_SYNCIO)
+               wq = bp->b_target->bt_mount->m_log_workqueue;
+       else
+               wq = bp->b_target->bt_mount->m_buf_workqueue;
+
        INIT_WORK(&bp->b_iodone_work, xfs_buf_ioend_work);
-       queue_work(bp->b_target->bt_mount->m_buf_workqueue, &bp->b_iodone_work);
+       queue_work(wq, &bp->b_iodone_work);
 }
 
 void
diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c
index 03e3cc2..4b8cd37 100644
--- a/fs/xfs/xfs_super.c
+++ b/fs/xfs/xfs_super.c
@@ -843,8 +843,7 @@ xfs_init_mount_workqueues(
        struct xfs_mount        *mp)
 {
        mp->m_buf_workqueue = alloc_workqueue("xfs-buf/%s",
-                       WQ_MEM_RECLAIM|WQ_HIGHPRI|WQ_FREEZABLE, 1,
-                       mp->m_fsname);
+                       WQ_MEM_RECLAIM|WQ_FREEZABLE, 1, mp->m_fsname);
        if (!mp->m_buf_workqueue)
                goto out;
 
@@ -869,7 +868,7 @@ xfs_init_mount_workqueues(
                goto out_destroy_cil;
 
        mp->m_log_workqueue = alloc_workqueue("xfs-log/%s",
-                       WQ_FREEZABLE, 0, mp->m_fsname);
+                       WQ_FREEZABLE|WQ_HIGHPRI, 0, mp->m_fsname);
        if (!mp->m_log_workqueue)
                goto out_destroy_reclaim;
 
-- 
1.8.3.1

<Prev in Thread] Current Thread [Next in Thread>