[PATCH 1/4] Avoid taking waitqueue lock in dmapool

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Matthew Wilcox
Date: Wednesday, September 26, 2007 - 12:01 pm

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 <willy@linux.intel.com>
---
 mm/dmapool.c |    9 +++++----
 1 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/mm/dmapool.c b/mm/dmapool.c
index 6201371..a359b5e 100644
--- a/mm/dmapool.c
+++ b/mm/dmapool.c
@@ -273,8 +273,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 ... */
@@ -296,12 +296,13 @@ void *dma_pool_alloc(struct dma_pool *pool, gfp_t mem_flags,
 			DECLARE_WAITQUEUE(wait, current);
 
 			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;
@@ -401,7 +402,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);
-- 
1.5.3.1

-
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
dmapool, Matthew Wilcox, (Wed Sep 26, 11:57 am)
[PATCH 1/4] Avoid taking waitqueue lock in dmapool, Matthew Wilcox, (Wed Sep 26, 12:01 pm)
[PATCH 2/4] dmapool: Validate parameters to dma_pool_create, Matthew Wilcox, (Wed Sep 26, 12:01 pm)
[PATCH 3/4] Change dmapool free block management, Matthew Wilcox, (Wed Sep 26, 12:01 pm)
Re: [PATCH 3/4] Change dmapool free block management, Roland Dreier, (Wed Sep 26, 12:23 pm)
Re: [PATCH 1/4] Avoid taking waitqueue lock in dmapool, David Miller, (Wed Sep 26, 2:10 pm)
Re: [PATCH 3/4] Change dmapool free block management, David Miller, (Wed Sep 26, 2:13 pm)