xfs
[Top] [All Lists]

[PATCH 040/102] xfs: remove log space waitqueues

To: xfs@xxxxxxxxxxx
Subject: [PATCH 040/102] xfs: remove log space waitqueues
From: Dave Chinner <david@xxxxxxxxxxxxx>
Date: Thu, 23 Aug 2012 15:01:58 +1000
In-reply-to: <1345698180-13612-1-git-send-email-david@xxxxxxxxxxxxx>
References: <1345698180-13612-1-git-send-email-david@xxxxxxxxxxxxx>
From: Christoph Hellwig <hch@xxxxxxxxxxxxx>

Upstream commit: 14a7235fba4302a82d61150eda92ec90d3ae9cfb

The tic->t_wait waitqueues can never have more than a single waiter
on them, so we can easily replace them with a task_struct pointer
and wake_up_process.

Reviewed-by: Mark Tinguely <tinguely@xxxxxxx>
Signed-off-by: Christoph Hellwig <hch@xxxxxx>
Reviewed-by: Dave Chinner <dchinner@xxxxxxxxxx>
Signed-off-by: Ben Myers <bpm@xxxxxxx>
---
 fs/xfs/xfs_log.c      |   24 +++++++++++++++---------
 fs/xfs/xfs_log_priv.h |    2 +-
 2 files changed, 16 insertions(+), 10 deletions(-)

diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c
index d299223..fc2b84b 100644
--- a/fs/xfs/xfs_log.c
+++ b/fs/xfs/xfs_log.c
@@ -169,7 +169,7 @@ xlog_reserveq_wake(
                *free_bytes -= need_bytes;
 
                trace_xfs_log_grant_wake_up(log, tic);
-               wake_up(&tic->t_wait);
+               wake_up_process(tic->t_task);
        }
 
        return true;
@@ -193,7 +193,7 @@ xlog_writeq_wake(
                *free_bytes -= need_bytes;
 
                trace_xfs_log_regrant_write_wake_up(log, tic);
-               wake_up(&tic->t_wait);
+               wake_up_process(tic->t_task);
        }
 
        return true;
@@ -212,10 +212,13 @@ xlog_reserveq_wait(
                        goto shutdown;
                xlog_grant_push_ail(log, need_bytes);
 
+               __set_current_state(TASK_UNINTERRUPTIBLE);
+               spin_unlock(&log->l_grant_reserve_lock);
+
                XFS_STATS_INC(xs_sleep_logspace);
-               trace_xfs_log_grant_sleep(log, tic);
 
-               xlog_wait(&tic->t_wait, &log->l_grant_reserve_lock);
+               trace_xfs_log_grant_sleep(log, tic);
+               schedule();
                trace_xfs_log_grant_wake(log, tic);
 
                spin_lock(&log->l_grant_reserve_lock);
@@ -243,10 +246,13 @@ xlog_writeq_wait(
                        goto shutdown;
                xlog_grant_push_ail(log, need_bytes);
 
+               __set_current_state(TASK_UNINTERRUPTIBLE);
+               spin_unlock(&log->l_grant_write_lock);
+
                XFS_STATS_INC(xs_sleep_logspace);
-               trace_xfs_log_regrant_write_sleep(log, tic);
 
-               xlog_wait(&tic->t_wait, &log->l_grant_write_lock);
+               trace_xfs_log_regrant_write_sleep(log, tic);
+               schedule();
                trace_xfs_log_regrant_write_wake(log, tic);
 
                spin_lock(&log->l_grant_write_lock);
@@ -3327,6 +3333,7 @@ xlog_ticket_alloc(
         }
 
        atomic_set(&tic->t_ref, 1);
+       tic->t_task             = current;
        INIT_LIST_HEAD(&tic->t_queue);
        tic->t_unit_res         = unit_bytes;
        tic->t_curr_res         = unit_bytes;
@@ -3338,7 +3345,6 @@ xlog_ticket_alloc(
        tic->t_trans_type       = 0;
        if (xflags & XFS_LOG_PERM_RESERV)
                tic->t_flags |= XLOG_TIC_PERM_RESERV;
-       init_waitqueue_head(&tic->t_wait);
 
        xlog_tic_reset_res(tic);
 
@@ -3666,12 +3672,12 @@ xfs_log_force_umount(
         */
        spin_lock(&log->l_grant_reserve_lock);
        list_for_each_entry(tic, &log->l_reserveq, t_queue)
-               wake_up(&tic->t_wait);
+               wake_up_process(tic->t_task);
        spin_unlock(&log->l_grant_reserve_lock);
 
        spin_lock(&log->l_grant_write_lock);
        list_for_each_entry(tic, &log->l_writeq, t_queue)
-               wake_up(&tic->t_wait);
+               wake_up_process(tic->t_task);
        spin_unlock(&log->l_grant_write_lock);
 
        if (!(log->l_iclog->ic_state & XLOG_STATE_IOERROR)) {
diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h
index 785905e..d8c5e47 100644
--- a/fs/xfs/xfs_log_priv.h
+++ b/fs/xfs/xfs_log_priv.h
@@ -239,8 +239,8 @@ typedef struct xlog_res {
 } xlog_res_t;
 
 typedef struct xlog_ticket {
-       wait_queue_head_t  t_wait;       /* ticket wait queue */
        struct list_head   t_queue;      /* reserve/write queue */
+       struct task_struct *t_task;      /* task that owns this ticket */
        xlog_tid_t         t_tid;        /* transaction identifier       : 4  */
        atomic_t           t_ref;        /* ticket reference count       : 4  */
        int                t_curr_res;   /* current reservation in bytes : 4  */
-- 
1.7.10

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