use prepare_to_wait in VM/VFS
Subsystems (4)
PATCH 2/4 use prepare_to_wait in VM/VFS
The patch uses the new wakeup machinery in some hot parts of the VFS and block layers.
wait_on_buffer(), wait_on_page(), lock_page(), blk_congestion_wait(). Also in get_request_wait(), although the benefit for exclusive wakeups will be lower.
drivers/block/ll_rw_blk.c | 17 +++++--------- fs/buffer.c | 16 +++++-------- include/linux/pagemap.h | 8 +++++- mm/filemap.c | 55 ++++++++++++++++------------------------------ 4 files changed, 40 insertions(+), 56 deletions(-)
drivers/block/ll_rw_blk.c renamed from drivers/block/ll_rw_blk.c~vm-wakeups +7 -10
@@ -1233,24 +1233,23 @@ static struct request *get_request(reque*/ static struct request *get_request_wait (request_queue_t *q,int rw) { -DECLARE_WAITQUEUE (wait, current); +DEFINE_WAIT (wait);struct request_list *rl = &q->rq[rw];struct request *rq;spin_lock_prefetch (q->queue_lock);generic_unplug_device (q); -add_wait_queue_exclusive (&rl->wait, &wait);do { -set_current_state (TASK_UNINTERRUPTIBLE ); +prepare_to_wait_exclusive (&rl->wait, &wait, +TASK_UNINTERRUPTIBLE );if (!rl->count)schedule (); +finish_wait (&rl->wait, &wait);spin_lock_irq (q->queue_lock); rq =get_request (q, rw);spin_unlock_irq (q->queue_lock); }while (rq ==NULL ); -remove_wait_queue (&rl->wait, &wait); - current->state =TASK_RUNNING ;return rq; }
@@ -1460,18 +1459,16 @@ void blk_put_request(struct request *req*/ void blk_congestion_wait (int rw,long timeout) { -DECLARE_WAITQUEUE (wait, current); +DEFINE_WAIT (wait);struct congestion_state *cs = &congestion_states[rw];if (atomic_read (&cs->nr_congested_queues) ==0 )return ;blk_run_queues (); -set_current_state (TASK_UNINTERRUPTIBLE ); -add_wait_queue (&cs->wqh, &wait); +prepare_to_wait (&cs->wqh, &wait,TASK_UNINTERRUPTIBLE );if (atomic_read (&cs->nr_congested_queues) !=0 )schedule_timeout (timeout); -set_current_state (TASK_RUNNING ); -remove_wait_queue (&cs->wqh, &wait); +finish_wait (&cs->wqh, &wait); }/*
fs/buffer.c renamed from fs/buffer.c~vm-wakeups +6 -10
@@ -128,22 +128,18 @@ void unlock_buffer(struct buffer_head *b*/ void __wait_on_buffer (struct buffer_head * bh) { -wait_queue_head_t *wq =bh_waitq_head (bh); -struct task_struct *tsk = current; -DECLARE_WAITQUEUE (wait, tsk); +wait_queue_head_t *wqh =bh_waitq_head (bh); +DEFINE_WAIT (wait);get_bh (bh); -add_wait_queue (wq, &wait);do { +prepare_to_wait (wqh, &wait,TASK_UNINTERRUPTIBLE );blk_run_queues (); -set_task_state (tsk,TASK_UNINTERRUPTIBLE ); -if (!buffer_locked (bh)) -break ; -schedule (); +if (buffer_locked (bh)) +schedule (); }while (buffer_locked (bh)); - tsk->state =TASK_RUNNING ; -remove_wait_queue (wq, &wait);put_bh (bh); +finish_wait (wqh, &wait); } static inline void
mm/filemap.c renamed from mm/filemap.c~vm-wakeups +20 -35
77 lines not on this page · raw message
include/linux/pagemap.h renamed from include/linux/pagemap.h~vm-wakeups +7 -1
@@ -74,9 +74,15 @@ static inline void ___add_to_page_cache(inc_page_state (nr_pagecache); } -extern void FASTCALL (lock_page (struct page *page)); +extern void FASTCALL (__lock_page (struct page *page));extern void FASTCALL (unlock_page (struct page *page)); +static inline void lock_page (struct page *page) +{ +if (TestSetPageLocked (page)) +__lock_page (page); +} +/* * This is exported only for wait_on_page_locked/wait_on_page_writeback. * Never use this directly!
.