xfs
[Top] [All Lists]

[PATCH 10/12] xfs: share code for grant head wakeups

To: xfs@xxxxxxxxxxx
Subject: [PATCH 10/12] xfs: share code for grant head wakeups
From: Christoph Hellwig <hch@xxxxxxxxxxxxx>
Date: Sun, 19 Feb 2012 21:31:29 -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   |   50 ++++++++++++++++++++------------------------------
 fs/xfs/xfs_trace.h |    1 -
 2 files changed, 20 insertions(+), 31 deletions(-)

Index: xfs/fs/xfs/xfs_log.c
===================================================================
--- xfs.orig/fs/xfs/xfs_log.c   2012-02-19 13:06:35.086627572 -0800
+++ xfs/fs/xfs/xfs_log.c        2012-02-19 13:07:14.849960798 -0800
@@ -171,49 +171,39 @@ xlog_grant_head_wake_all(
        spin_unlock(&head->lock);
 }
 
-STATIC bool
-xlog_reserveq_wake(
+static inline int
+xlog_ticket_reservation(
        struct log              *log,
-       int                     *free_bytes)
+       struct xlog_grant_head  *head,
+       struct xlog_ticket      *tic)
 {
-       struct xlog_ticket      *tic;
-       int                     need_bytes;
-
-       list_for_each_entry(tic, &log->l_reserve_head.waiters, t_queue) {
+       if (head == &log->l_write_head) {
+               ASSERT(tic->t_flags & XLOG_TIC_PERM_RESERV);
+               return tic->t_unit_res;
+       } else {
                if (tic->t_flags & XLOG_TIC_PERM_RESERV)
-                       need_bytes = tic->t_unit_res * tic->t_cnt;
+                       return tic->t_unit_res * tic->t_cnt;
                else
-                       need_bytes = tic->t_unit_res;
-
-               if (*free_bytes < need_bytes)
-                       return false;
-               *free_bytes -= need_bytes;
-
-               trace_xfs_log_grant_wake_up(log, tic);
-               wake_up_process(tic->t_task);
+                       return tic->t_unit_res;
        }
-
-       return true;
 }
 
 STATIC bool
-xlog_writeq_wake(
+xlog_grant_head_wake(
        struct log              *log,
+       struct xlog_grant_head  *head,
        int                     *free_bytes)
 {
        struct xlog_ticket      *tic;
        int                     need_bytes;
 
-       list_for_each_entry(tic, &log->l_write_head.waiters, t_queue) {
-               ASSERT(tic->t_flags & XLOG_TIC_PERM_RESERV);
-
-               need_bytes = tic->t_unit_res;
-
+       list_for_each_entry(tic, &head->waiters, t_queue) {
+               need_bytes = xlog_ticket_reservation(log, head, tic);
                if (*free_bytes < need_bytes)
                        return false;
-               *free_bytes -= need_bytes;
 
-               trace_xfs_log_regrant_write_wake_up(log, tic);
+               *free_bytes -= need_bytes;
+               trace_xfs_log_grant_wake_up(log, tic);
                wake_up_process(tic->t_task);
        }
 
@@ -772,7 +762,7 @@ xfs_log_space_wake(
 
                spin_lock(&log->l_write_head.lock);
                free_bytes = xlog_space_left(log, &log->l_write_head.grant);
-               xlog_writeq_wake(log, &free_bytes);
+               xlog_grant_head_wake(log, &log->l_write_head, &free_bytes);
                spin_unlock(&log->l_write_head.lock);
        }
 
@@ -781,7 +771,7 @@ xfs_log_space_wake(
 
                spin_lock(&log->l_reserve_head.lock);
                free_bytes = xlog_space_left(log, &log->l_reserve_head.grant);
-               xlog_reserveq_wake(log, &free_bytes);
+               xlog_grant_head_wake(log, &log->l_reserve_head, &free_bytes);
                spin_unlock(&log->l_reserve_head.lock);
        }
 }
@@ -2562,7 +2552,7 @@ xlog_grant_log_space(
        free_bytes = xlog_space_left(log, &log->l_reserve_head.grant);
        if (!list_empty_careful(&log->l_reserve_head.waiters)) {
                spin_lock(&log->l_reserve_head.lock);
-               if (!xlog_reserveq_wake(log, &free_bytes) ||
+               if (!xlog_grant_head_wake(log, &log->l_reserve_head, 
&free_bytes) ||
                    free_bytes < need_bytes) {
                        error = xlog_grant_head_wait(log, &log->l_reserve_head,
                                                     tic, need_bytes);
@@ -2618,7 +2608,7 @@ xlog_regrant_write_log_space(
        free_bytes = xlog_space_left(log, &log->l_write_head.grant);
        if (!list_empty_careful(&log->l_write_head.waiters)) {
                spin_lock(&log->l_write_head.lock);
-               if (!xlog_writeq_wake(log, &free_bytes) ||
+               if (!xlog_grant_head_wake(log, &log->l_write_head, &free_bytes) 
||
                    free_bytes < need_bytes) {
                        error = xlog_grant_head_wait(log, &log->l_write_head,
                                                     tic, need_bytes);
Index: xfs/fs/xfs/xfs_trace.h
===================================================================
--- xfs.orig/fs/xfs/xfs_trace.h 2012-02-19 13:06:35.089960905 -0800
+++ xfs/fs/xfs/xfs_trace.h      2012-02-19 13:07:14.853294131 -0800
@@ -847,7 +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_wake_up);
 DEFINE_LOGGRANT_EVENT(xfs_log_regrant_reserve_enter);
 DEFINE_LOGGRANT_EVENT(xfs_log_regrant_reserve_exit);
 DEFINE_LOGGRANT_EVENT(xfs_log_regrant_reserve_sub);

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