diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
commit | c71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch) | |
tree | ecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /mm/dmapool.c | |
parent | ea53c912f8a86a8567697115b6a0d8152beee5c8 (diff) | |
parent | 6a00f206debf8a5c8899055726ad127dbeeed098 (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.c | 18 |
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 | ||
354 | static struct dma_page *pool_find_page(struct dma_pool *pool, dma_addr_t dma) | 356 | static 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; |