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>
This commit is contained in:
Родитель
0d0fb0f9c5
Коммит
5c5e3b33b7
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче