mm, mempool: disallow mempools based on slab caches with constructors
authorDavid Rientjes <[email protected]>
Wed, 15 Apr 2015 23:14:14 +0000 (16:14 -0700)
committerLinus Torvalds <[email protected]>
Wed, 15 Apr 2015 23:35:18 +0000 (16:35 -0700)
All occurrences of mempools based on slab caches with object constructors
have been removed from the tree, so disallow creating them.

We can only dereference mem->ctor in mm/mempool.c without including
mm/slab.h in include/linux/mempool.h.  So simply note the restriction,
just like the comment restricting usage of __GFP_ZERO, and warn on kernels
with CONFIG_DEBUG_VM() if such a mempool is allocated from.

We don't want to incur this check on every element allocation, so use
VM_BUG_ON().

Signed-off-by: David Rientjes <[email protected]>
Cc: Dave Kleikamp <[email protected]>
Cc: Christoph Hellwig <[email protected]>
Cc: Sebastian Ott <[email protected]>
Cc: Mikulas Patocka <[email protected]>
Cc: Catalin Marinas <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
include/linux/mempool.h
mm/mempool.c

index b19b3023c88031ef326e773afb7e8ecb6e3cd84a..69b6951e8fd231d96d69ec953fd900aba93c2274 100644 (file)
@@ -36,7 +36,8 @@ extern void mempool_free(void *element, mempool_t *pool);
 
 /*
  * A mempool_alloc_t and mempool_free_t that get the memory from
- * a slab that is passed in through pool_data.
+ * a slab cache that is passed in through pool_data.
+ * Note: the slab cache may not have a ctor function.
  */
 void *mempool_alloc_slab(gfp_t gfp_mask, void *pool_data);
 void mempool_free_slab(void *element, void *pool_data);
index 949970db28741532172ad2c7a65fdeb71c3f7404..b60fb85526ed62937e4545262b2cbb0b9894315f 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/mempool.h>
 #include <linux/blkdev.h>
 #include <linux/writeback.h>
+#include "slab.h"
 
 static void add_element(mempool_t *pool, void *element)
 {
@@ -334,6 +335,7 @@ EXPORT_SYMBOL(mempool_free);
 void *mempool_alloc_slab(gfp_t gfp_mask, void *pool_data)
 {
        struct kmem_cache *mem = pool_data;
+       VM_BUG_ON(mem->ctor);
        return kmem_cache_alloc(mem, gfp_mask);
 }
 EXPORT_SYMBOL(mempool_alloc_slab);