Merge git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf-next
[cascardo/linux.git] / mm / dmapool.c
index 59d10d1..71a8998 100644 (file)
@@ -271,6 +271,9 @@ void dma_pool_destroy(struct dma_pool *pool)
 {
        bool empty = false;
 
+       if (unlikely(!pool))
+               return;
+
        mutex_lock(&pools_reg_lock);
        mutex_lock(&pools_lock);
        list_del(&pool->pools);
@@ -334,7 +337,7 @@ void *dma_pool_alloc(struct dma_pool *pool, gfp_t mem_flags,
        /* pool_alloc_page() might sleep, so temporarily drop &pool->lock */
        spin_unlock_irqrestore(&pool->lock, flags);
 
-       page = pool_alloc_page(pool, mem_flags);
+       page = pool_alloc_page(pool, mem_flags & (~__GFP_ZERO));
        if (!page)
                return NULL;
 
@@ -372,9 +375,14 @@ void *dma_pool_alloc(struct dma_pool *pool, gfp_t mem_flags,
                        break;
                }
        }
-       memset(retval, POOL_POISON_ALLOCATED, pool->size);
+       if (!(mem_flags & __GFP_ZERO))
+               memset(retval, POOL_POISON_ALLOCATED, pool->size);
 #endif
        spin_unlock_irqrestore(&pool->lock, flags);
+
+       if (mem_flags & __GFP_ZERO)
+               memset(retval, 0, pool->size);
+
        return retval;
 }
 EXPORT_SYMBOL(dma_pool_alloc);