Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=2cae367e4854ff055c4f5e8aacd56b0eeec9f6cb
Commit:     2cae367e4854ff055c4f5e8aacd56b0eeec9f6cb
Parent:     e87aa773747fb5e4217d716ea22a573c03b6693a
Author:     Matthew Wilcox <[EMAIL PROTECTED]>
AuthorDate: Mon Dec 3 12:09:33 2007 -0500
Committer:  Matthew Wilcox <[EMAIL PROTECTED]>
CommitDate: Tue Dec 4 10:39:56 2007 -0500

    Avoid taking waitqueue lock in dmapool
    
    With one trivial change (taking the lock slightly earlier on wakeup
    from schedule), all uses of the waitq are under the pool lock, so we
    can use the locked (or __) versions of the wait queue functions, and
    avoid the extra spinlock.
    
    Signed-off-by: Matthew Wilcox <[EMAIL PROTECTED]>
    Acked-by: David S. Miller <[EMAIL PROTECTED]>
---
 mm/dmapool.c |    9 +++++----
 1 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/mm/dmapool.c b/mm/dmapool.c
index 92e886d..b5ff9ce 100644
--- a/mm/dmapool.c
+++ b/mm/dmapool.c
@@ -275,8 +275,8 @@ void *dma_pool_alloc(struct dma_pool *pool, gfp_t mem_flags,
        size_t offset;
        void *retval;
 
- restart:
        spin_lock_irqsave(&pool->lock, flags);
+ restart:
        list_for_each_entry(page, &pool->page_list, page_list) {
                int i;
                /* only cachable accesses here ... */
@@ -299,12 +299,13 @@ void *dma_pool_alloc(struct dma_pool *pool, gfp_t 
mem_flags,
                        DECLARE_WAITQUEUE(wait, current);
 
                        __set_current_state(TASK_INTERRUPTIBLE);
-                       add_wait_queue(&pool->waitq, &wait);
+                       __add_wait_queue(&pool->waitq, &wait);
                        spin_unlock_irqrestore(&pool->lock, flags);
 
                        schedule_timeout(POOL_TIMEOUT_JIFFIES);
 
-                       remove_wait_queue(&pool->waitq, &wait);
+                       spin_lock_irqsave(&pool->lock, flags);
+                       __remove_wait_queue(&pool->waitq, &wait);
                        goto restart;
                }
                retval = NULL;
@@ -406,7 +407,7 @@ void dma_pool_free(struct dma_pool *pool, void *vaddr, 
dma_addr_t dma)
        page->in_use--;
        set_bit(block, &page->bitmap[map]);
        if (waitqueue_active(&pool->waitq))
-               wake_up(&pool->waitq);
+               wake_up_locked(&pool->waitq);
        /*
         * Resist a temptation to do
         *    if (!is_page_busy(bpp, page->bitmap)) pool_free_page(pool, page);
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to