diff options
| -rw-r--r-- | mm/dmapool.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/mm/dmapool.c b/mm/dmapool.c index 92e886d37e90..b5ff9ce8765b 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, | |||
| 275 | size_t offset; | 275 | size_t offset; |
| 276 | void *retval; | 276 | void *retval; |
| 277 | 277 | ||
| 278 | restart: | ||
| 279 | spin_lock_irqsave(&pool->lock, flags); | 278 | spin_lock_irqsave(&pool->lock, flags); |
| 279 | restart: | ||
| 280 | list_for_each_entry(page, &pool->page_list, page_list) { | 280 | list_for_each_entry(page, &pool->page_list, page_list) { |
| 281 | int i; | 281 | int i; |
| 282 | /* only cachable accesses here ... */ | 282 | /* only cachable accesses here ... */ |
| @@ -299,12 +299,13 @@ void *dma_pool_alloc(struct dma_pool *pool, gfp_t mem_flags, | |||
| 299 | DECLARE_WAITQUEUE(wait, current); | 299 | DECLARE_WAITQUEUE(wait, current); |
| 300 | 300 | ||
| 301 | __set_current_state(TASK_INTERRUPTIBLE); | 301 | __set_current_state(TASK_INTERRUPTIBLE); |
| 302 | add_wait_queue(&pool->waitq, &wait); | 302 | __add_wait_queue(&pool->waitq, &wait); |
| 303 | spin_unlock_irqrestore(&pool->lock, flags); | 303 | spin_unlock_irqrestore(&pool->lock, flags); |
| 304 | 304 | ||
| 305 | schedule_timeout(POOL_TIMEOUT_JIFFIES); | 305 | schedule_timeout(POOL_TIMEOUT_JIFFIES); |
| 306 | 306 | ||
| 307 | remove_wait_queue(&pool->waitq, &wait); | 307 | spin_lock_irqsave(&pool->lock, flags); |
| 308 | __remove_wait_queue(&pool->waitq, &wait); | ||
| 308 | goto restart; | 309 | goto restart; |
| 309 | } | 310 | } |
| 310 | retval = NULL; | 311 | retval = NULL; |
| @@ -406,7 +407,7 @@ void dma_pool_free(struct dma_pool *pool, void *vaddr, dma_addr_t dma) | |||
| 406 | page->in_use--; | 407 | page->in_use--; |
| 407 | set_bit(block, &page->bitmap[map]); | 408 | set_bit(block, &page->bitmap[map]); |
| 408 | if (waitqueue_active(&pool->waitq)) | 409 | if (waitqueue_active(&pool->waitq)) |
| 409 | wake_up(&pool->waitq); | 410 | wake_up_locked(&pool->waitq); |
| 410 | /* | 411 | /* |
| 411 | * Resist a temptation to do | 412 | * Resist a temptation to do |
| 412 | * if (!is_page_busy(bpp, page->bitmap)) pool_free_page(pool, page); | 413 | * if (!is_page_busy(bpp, page->bitmap)) pool_free_page(pool, page); |
