diff options
author | Dima Zavin <dima@android.com> | 2010-10-26 14:21:54 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-26 16:52:08 -0700 |
commit | ea05c8444e451f1cfbf78c68733e717ad7b8602b (patch) | |
tree | e1ebb0406f156e406b3bef5998084b688794923e /mm | |
parent | d65bfacb046f3df8aa11a9cb9b6e448f6171174d (diff) | |
download | lwn-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>
Diffstat (limited to 'mm')
-rw-r--r-- | mm/dmapool.c | 2 |
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) { |