Skip to content

Commit

Permalink
Avoid taking waitqueue lock in dmapool
Browse files Browse the repository at this point in the history
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]>
  • Loading branch information
Matthew Wilcox committed Dec 4, 2007
1 parent e87aa77 commit 2cae367
Showing 1 changed file with 5 additions and 4 deletions.
9 changes: 5 additions & 4 deletions mm/dmapool.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 ... */
Expand All @@ -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;
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 2cae367

Please sign in to comment.