summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDima Zavin <dima@android.com>2010-10-26 14:21:54 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2010-10-26 16:52:08 -0700
commitea05c8444e451f1cfbf78c68733e717ad7b8602b (patch)
treee1ebb0406f156e406b3bef5998084b688794923e
parentd65bfacb046f3df8aa11a9cb9b6e448f6171174d (diff)
downloadlwn-ea05c8444e451f1cfbf78c68733e717ad7b8602b.tar.gz
lwn-ea05c8444e451f1cfbf78c68733e717ad7b8602b.zip
mm: add a might_sleep_if() to dma_pool_alloc()
Buggy drivers (e.g. fsl_udc) could call dma_pool_alloc from atomic context with GFP_KERNEL. In most instances, the first pool_alloc_page call would succeed and the sleeping functions would never be called. This allowed the buggy drivers to slip through the cracks. Add a might_sleep_if() checking for __GFP_WAIT in flags. Signed-off-by: Dima Zavin <dima@android.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--mm/dmapool.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/mm/dmapool.c b/mm/dmapool.c
index 3df063706f53..4df2de77e069 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,
size_t offset;
void *retval;
+ might_sleep_if(mem_flags & __GFP_WAIT);
+
spin_lock_irqsave(&pool->lock, flags);
restart:
list_for_each_entry(page, &pool->page_list, page_list) {