diff options
author | Ron Lee <ron@debian.org> | 2009-05-21 15:28:22 -0400 |
---|---|---|
committer | Pekka Enberg <penberg@cs.helsinki.fi> | 2009-05-22 04:01:12 -0400 |
commit | 6746136520cd0827320a83e62d0a023a5a433650 (patch) | |
tree | 2e57aef24fbb8e8531aad10061245ec4bddda6f9 | |
parent | 45d447406a19cbfd42720f066f156f4eb9d68801 (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>
-rw-r--r-- | mm/slab.c | 9 |
1 files changed, 9 insertions, 0 deletions
@@ -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(); |