aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
authorRon Lee <ron@debian.org>2009-05-21 15:28:22 -0400
committerPekka Enberg <penberg@cs.helsinki.fi>2009-05-22 04:01:12 -0400
commit6746136520cd0827320a83e62d0a023a5a433650 (patch)
tree2e57aef24fbb8e8531aad10061245ec4bddda6f9 /mm
parent45d447406a19cbfd42720f066f156f4eb9d68801 (diff)
slab: fix generic PAGE_POISONING conflict with SLAB_RED_ZONE
A generic page poisoning mechanism was added with commit: 6a11f75b6a17b5d9ac5025f8d048382fd1f47377 which destructively poisons full pages with a bitpattern. On arches where PAGE_POISONING is used, this conflicts with the slab redzone checking enabled by DEBUG_SLAB, scribbling bits all over its magic words and making it complain about that quite emphatically. On x86 (and I presume at present all the other arches which set ARCH_SUPPORTS_DEBUG_PAGEALLOC too), the kernel_map_pages() operation is non destructive so it can coexist with the other DEBUG_SLAB mechanisms just fine. This patch favours the expensive full page destruction test for cases where there is a collision and it is explicitly selected. Signed-off-by: Ron Lee <ron@debian.org> Signed-off-by: Pekka Enberg <penberg@cs.helsinki.fi>
Diffstat (limited to 'mm')
-rw-r--r--mm/slab.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/mm/slab.c b/mm/slab.c
index 9a90b00d2f91..1a6040d0f41d 100644
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -2353,6 +2353,15 @@ kmem_cache_create (const char *name, size_t size, size_t align,
2353 /* really off slab. No need for manual alignment */ 2353 /* really off slab. No need for manual alignment */
2354 slab_size = 2354 slab_size =
2355 cachep->num * sizeof(kmem_bufctl_t) + sizeof(struct slab); 2355 cachep->num * sizeof(kmem_bufctl_t) + sizeof(struct slab);
2356
2357#ifdef CONFIG_PAGE_POISONING
2358 /* If we're going to use the generic kernel_map_pages()
2359 * poisoning, then it's going to smash the contents of
2360 * the redzone and userword anyhow, so switch them off.
2361 */
2362 if (size % PAGE_SIZE == 0 && flags & SLAB_POISON)
2363 flags &= ~(SLAB_RED_ZONE | SLAB_STORE_USER);
2364#endif
2356 } 2365 }
2357 2366
2358 cachep->colour_off = cache_line_size(); 2367 cachep->colour_off = cache_line_size();