diff options
author | Shiyong Li <shi-yong.li@motorola.com> | 2010-04-12 13:48:21 +0800 |
---|---|---|
committer | Pekka Enberg <penberg@cs.helsinki.fi> | 2010-04-14 20:52:45 +0300 |
commit | 5c5e3b33b7cb959a401f823707bee006caadd76e (patch) | |
tree | aa3c77659d80d714e833a35bcfc20b72a9b6f368 /mm/slab.c | |
parent | 0d0fb0f9c5fddef4a10242fe3337f00f528a3099 (diff) | |
download | linux-stable-5c5e3b33b7cb959a401f823707bee006caadd76e.tar.gz linux-stable-5c5e3b33b7cb959a401f823707bee006caadd76e.tar.bz2 linux-stable-5c5e3b33b7cb959a401f823707bee006caadd76e.zip |
slab: Fix missing DEBUG_SLAB last user
Even with SLAB_RED_ZONE and SLAB_STORE_USER enabled, kernel would NOT store
redzone and last user data around allocated memory space if "arch cache line >
sizeof(unsigned long long)". As a result, last user information is unexpectedly
MISSED while dumping slab corruption log.
This fix makes sure that redzone and last user tags get stored unless the
required alignment breaks redzone's.
Signed-off-by: Shiyong Li <shi-yong.li@motorola.com>
Signed-off-by: Pekka Enberg <penberg@cs.helsinki.fi>
Diffstat (limited to 'mm/slab.c')
-rw-r--r-- | mm/slab.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/mm/slab.c b/mm/slab.c index bac0f4fcc216..525c66466469 100644 --- a/mm/slab.c +++ b/mm/slab.c @@ -2220,8 +2220,8 @@ kmem_cache_create (const char *name, size_t size, size_t align, if (ralign < align) { ralign = align; } - /* disable debug if necessary */ - if (ralign > __alignof__(unsigned long long)) + /* disable debug if not aligning with REDZONE_ALIGN */ + if (ralign & (__alignof__(unsigned long long) - 1)) flags &= ~(SLAB_RED_ZONE | SLAB_STORE_USER); /* * 4) Store it. @@ -2247,8 +2247,8 @@ kmem_cache_create (const char *name, size_t size, size_t align, */ if (flags & SLAB_RED_ZONE) { /* add space for red zone words */ - cachep->obj_offset += sizeof(unsigned long long); - size += 2 * sizeof(unsigned long long); + cachep->obj_offset += align; + size += align + sizeof(unsigned long long); } if (flags & SLAB_STORE_USER) { /* user store requires one word storage behind the end of |