aboutsummaryrefslogtreecommitdiffstats
path: root/mm/dmapool.c
diff options
context:
space:
mode:
authorGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
committerGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
commitc71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch)
treeecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /mm/dmapool.c
parentea53c912f8a86a8567697115b6a0d8152beee5c8 (diff)
parent6a00f206debf8a5c8899055726ad127dbeeed098 (diff)
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts: litmus/sched_cedf.c
Diffstat (limited to 'mm/dmapool.c')
-rw-r--r--mm/dmapool.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/mm/dmapool.c b/mm/dmapool.c
index 3df063706f53..03bf3bb4519a 100644
--- a/mm/dmapool.c
+++ b/mm/dmapool.c
@@ -311,6 +311,8 @@ void *dma_pool_alloc(struct dma_pool *pool, gfp_t mem_flags,
311 size_t offset; 311 size_t offset;
312 void *retval; 312 void *retval;
313 313
314 might_sleep_if(mem_flags & __GFP_WAIT);
315
314 spin_lock_irqsave(&pool->lock, flags); 316 spin_lock_irqsave(&pool->lock, flags);
315 restart: 317 restart:
316 list_for_each_entry(page, &pool->page_list, page_list) { 318 list_for_each_entry(page, &pool->page_list, page_list) {
@@ -322,7 +324,7 @@ void *dma_pool_alloc(struct dma_pool *pool, gfp_t mem_flags,
322 if (mem_flags & __GFP_WAIT) { 324 if (mem_flags & __GFP_WAIT) {
323 DECLARE_WAITQUEUE(wait, current); 325 DECLARE_WAITQUEUE(wait, current);
324 326
325 __set_current_state(TASK_INTERRUPTIBLE); 327 __set_current_state(TASK_UNINTERRUPTIBLE);
326 __add_wait_queue(&pool->waitq, &wait); 328 __add_wait_queue(&pool->waitq, &wait);
327 spin_unlock_irqrestore(&pool->lock, flags); 329 spin_unlock_irqrestore(&pool->lock, flags);
328 330
@@ -353,20 +355,15 @@ EXPORT_SYMBOL(dma_pool_alloc);
353 355
354static struct dma_page *pool_find_page(struct dma_pool *pool, dma_addr_t dma) 356static struct dma_page *pool_find_page(struct dma_pool *pool, dma_addr_t dma)
355{ 357{
356 unsigned long flags;
357 struct dma_page *page; 358 struct dma_page *page;
358 359
359 spin_lock_irqsave(&pool->lock, flags);
360 list_for_each_entry(page, &pool->page_list, page_list) { 360 list_for_each_entry(page, &pool->page_list, page_list) {
361 if (dma < page->dma) 361 if (dma < page->dma)
362 continue; 362 continue;
363 if (dma < (page->dma + pool->allocation)) 363 if (dma < (page->dma + pool->allocation))
364 goto done; 364 return page;
365 } 365 }
366 page = NULL; 366 return NULL;
367 done:
368 spin_unlock_irqrestore(&pool->lock, flags);
369 return page;
370} 367}
371 368
372/** 369/**
@@ -384,8 +381,10 @@ void dma_pool_free(struct dma_pool *pool, void *vaddr, dma_addr_t dma)
384 unsigned long flags; 381 unsigned long flags;
385 unsigned int offset; 382 unsigned int offset;
386 383
384 spin_lock_irqsave(&pool->lock, flags);
387 page = pool_find_page(pool, dma); 385 page = pool_find_page(pool, dma);
388 if (!page) { 386 if (!page) {
387 spin_unlock_irqrestore(&pool->lock, flags);
389 if (pool->dev) 388 if (pool->dev)
390 dev_err(pool->dev, 389 dev_err(pool->dev,
391 "dma_pool_free %s, %p/%lx (bad dma)\n", 390 "dma_pool_free %s, %p/%lx (bad dma)\n",
@@ -399,6 +398,7 @@ void dma_pool_free(struct dma_pool *pool, void *vaddr, dma_addr_t dma)
399 offset = vaddr - page->vaddr; 398 offset = vaddr - page->vaddr;
400#ifdef DMAPOOL_DEBUG 399#ifdef DMAPOOL_DEBUG
401 if ((dma - page->dma) != offset) { 400 if ((dma - page->dma) != offset) {
401 spin_unlock_irqrestore(&pool->lock, flags);
402 if (pool->dev) 402 if (pool->dev)
403 dev_err(pool->dev, 403 dev_err(pool->dev,
404 "dma_pool_free %s, %p (bad vaddr)/%Lx\n", 404 "dma_pool_free %s, %p (bad vaddr)/%Lx\n",
@@ -416,6 +416,7 @@ void dma_pool_free(struct dma_pool *pool, void *vaddr, dma_addr_t dma)
416 chain = *(int *)(page->vaddr + chain); 416 chain = *(int *)(page->vaddr + chain);
417 continue; 417 continue;
418 } 418 }
419 spin_unlock_irqrestore(&pool->lock, flags);
419 if (pool->dev) 420 if (pool->dev)
420 dev_err(pool->dev, "dma_pool_free %s, dma %Lx " 421 dev_err(pool->dev, "dma_pool_free %s, dma %Lx "
421 "already free\n", pool->name, 422 "already free\n", pool->name,
@@ -430,7 +431,6 @@ void dma_pool_free(struct dma_pool *pool, void *vaddr, dma_addr_t dma)
430 memset(vaddr, POOL_POISON_FREED, pool->size); 431 memset(vaddr, POOL_POISON_FREED, pool->size);
431#endif 432#endif
432 433
433 spin_lock_irqsave(&pool->lock, flags);
434 page->in_use--; 434 page->in_use--;
435 *(int *)vaddr = page->offset; 435 *(int *)vaddr = page->offset;
436 page->offset = offset; 436 page->offset = offset;