xfs
[Top] [All Lists]

[PATCH 09/12] xfs: share code for grant head waiting

To: xfs@xxxxxxxxxxx
Subject: [PATCH 09/12] xfs: share code for grant head waiting
From: Christoph Hellwig <hch@xxxxxxxxxxxxx>
Date: Sun, 19 Feb 2012 21:31:28 -0500
References: <20120220023119.435889631@xxxxxxxxxxxxxxxxxxxxxx>
User-agent: quilt/0.48-1
Reviewed-by: Ben Myers <bpm@xxxxxxx>
Reviewed-by: Mark Tinguely <tinguely@xxxxxxx>
Signed-off-by: Christoph Hellwig <hch@xxxxxx>

---
 fs/xfs/xfs_log.c   |   63 +++++++++++++++--------------------------------------
 fs/xfs/xfs_trace.h |    2 -
 2 files changed, 18 insertions(+), 47 deletions(-)

Index: xfs/fs/xfs/xfs_log.c
===================================================================
--- xfs.orig/fs/xfs/xfs_log.c   2012-02-19 13:06:14.093294296 -0800
+++ xfs/fs/xfs/xfs_log.c        2012-02-19 13:06:35.086627572 -0800
@@ -221,12 +221,13 @@ xlog_writeq_wake(
 }
 
 STATIC int
-xlog_reserveq_wait(
+xlog_grant_head_wait(
        struct log              *log,
+       struct xlog_grant_head  *head,
        struct xlog_ticket      *tic,
        int                     need_bytes)
 {
-       list_add_tail(&tic->t_queue, &log->l_reserve_head.waiters);
+       list_add_tail(&tic->t_queue, &head->waiters);
 
        do {
                if (XLOG_FORCED_SHUTDOWN(log))
@@ -234,7 +235,7 @@ xlog_reserveq_wait(
                xlog_grant_push_ail(log, need_bytes);
 
                __set_current_state(TASK_UNINTERRUPTIBLE);
-               spin_unlock(&log->l_reserve_head.lock);
+               spin_unlock(&head->lock);
 
                XFS_STATS_INC(xs_sleep_logspace);
 
@@ -242,44 +243,10 @@ xlog_reserveq_wait(
                schedule();
                trace_xfs_log_grant_wake(log, tic);
 
-               spin_lock(&log->l_reserve_head.lock);
+               spin_lock(&head->lock);
                if (XLOG_FORCED_SHUTDOWN(log))
                        goto shutdown;
-       } while (xlog_space_left(log, &log->l_reserve_head.grant) < need_bytes);
-
-       list_del_init(&tic->t_queue);
-       return 0;
-shutdown:
-       list_del_init(&tic->t_queue);
-       return XFS_ERROR(EIO);
-}
-
-STATIC int
-xlog_writeq_wait(
-       struct log              *log,
-       struct xlog_ticket      *tic,
-       int                     need_bytes)
-{
-       list_add_tail(&tic->t_queue, &log->l_write_head.waiters);
-
-       do {
-               if (XLOG_FORCED_SHUTDOWN(log))
-                       goto shutdown;
-               xlog_grant_push_ail(log, need_bytes);
-
-               __set_current_state(TASK_UNINTERRUPTIBLE);
-               spin_unlock(&log->l_write_head.lock);
-
-               XFS_STATS_INC(xs_sleep_logspace);
-
-               trace_xfs_log_regrant_write_sleep(log, tic);
-               schedule();
-               trace_xfs_log_regrant_write_wake(log, tic);
-
-               spin_lock(&log->l_write_head.lock);
-               if (XLOG_FORCED_SHUTDOWN(log))
-                       goto shutdown;
-       } while (xlog_space_left(log, &log->l_write_head.grant) < need_bytes);
+       } while (xlog_space_left(log, &head->grant) < need_bytes);
 
        list_del_init(&tic->t_queue);
        return 0;
@@ -2596,12 +2563,15 @@ xlog_grant_log_space(
        if (!list_empty_careful(&log->l_reserve_head.waiters)) {
                spin_lock(&log->l_reserve_head.lock);
                if (!xlog_reserveq_wake(log, &free_bytes) ||
-                   free_bytes < need_bytes)
-                       error = xlog_reserveq_wait(log, tic, need_bytes);
+                   free_bytes < need_bytes) {
+                       error = xlog_grant_head_wait(log, &log->l_reserve_head,
+                                                    tic, need_bytes);
+               }
                spin_unlock(&log->l_reserve_head.lock);
        } else if (free_bytes < need_bytes) {
                spin_lock(&log->l_reserve_head.lock);
-               error = xlog_reserveq_wait(log, tic, need_bytes);
+               error = xlog_grant_head_wait(log, &log->l_reserve_head, tic,
+                                            need_bytes);
                spin_unlock(&log->l_reserve_head.lock);
        }
        if (error)
@@ -2649,12 +2619,15 @@ xlog_regrant_write_log_space(
        if (!list_empty_careful(&log->l_write_head.waiters)) {
                spin_lock(&log->l_write_head.lock);
                if (!xlog_writeq_wake(log, &free_bytes) ||
-                   free_bytes < need_bytes)
-                       error = xlog_writeq_wait(log, tic, need_bytes);
+                   free_bytes < need_bytes) {
+                       error = xlog_grant_head_wait(log, &log->l_write_head,
+                                                    tic, need_bytes);
+               }
                spin_unlock(&log->l_write_head.lock);
        } else if (free_bytes < need_bytes) {
                spin_lock(&log->l_write_head.lock);
-               error = xlog_writeq_wait(log, tic, need_bytes);
+               error = xlog_grant_head_wait(log, &log->l_write_head, tic,
+                                            need_bytes);
                spin_unlock(&log->l_write_head.lock);
        }
 
Index: xfs/fs/xfs/xfs_trace.h
===================================================================
--- xfs.orig/fs/xfs/xfs_trace.h 2012-02-19 13:05:22.489961102 -0800
+++ xfs/fs/xfs/xfs_trace.h      2012-02-19 13:06:35.089960905 -0800
@@ -847,8 +847,6 @@ DEFINE_LOGGRANT_EVENT(xfs_log_grant_wake
 DEFINE_LOGGRANT_EVENT(xfs_log_regrant_write_enter);
 DEFINE_LOGGRANT_EVENT(xfs_log_regrant_write_exit);
 DEFINE_LOGGRANT_EVENT(xfs_log_regrant_write_error);
-DEFINE_LOGGRANT_EVENT(xfs_log_regrant_write_sleep);
-DEFINE_LOGGRANT_EVENT(xfs_log_regrant_write_wake);
 DEFINE_LOGGRANT_EVENT(xfs_log_regrant_write_wake_up);
 DEFINE_LOGGRANT_EVENT(xfs_log_regrant_reserve_enter);
 DEFINE_LOGGRANT_EVENT(xfs_log_regrant_reserve_exit);

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