Re: [PATCH] Fix missing of last user info while getting DEBUG_SLABconfig enabled

From: Pekka Enberg
Date: Thu Apr 01 2010 - 02:29:58 EST


ShiYong LI kirjoitti:
Hi all,
For OMAP3430 chip, while getting DEBUG_SLAB config enabled, found a bug that last user information is missed in slab corruption log dumped by kernel. Actually, It's caused by ignorance of redzone and last user tag while calling kmem_cache_create() function if cache alignment > 16 bytes (unsigned long long). Here is a patch to fix this problem. Already verified it on kernel 2.6.29.

The patch is badly whitespace damaged.

From 26a5a8ad2a1d7612929a91f6866cea9d1bea6077 Mon Sep 17 00:00:00 2001
From: Shiyong Li <shi-yong.li@xxxxxxxxxxxx <mailto:shi-yong.li@xxxxxxxxxxxx>>
Date: Wed, 31 Mar 2010 10:09:35 +0800
Subject: [PATCH] Fix missing of last user info while getting DEBUG_SLAB config enabled.
As OMAP3 cache line is 64 byte long, while calling kmem_cache_create()
funtion, some cases need 64 byte alignment of requested memory space.
But, if cache line > 16 bytes, current kernel ignore redzone
and last user debug head/trail tag to make sure this alignment is not
broken.
This fix removes codes that ignorance of redzone and last user tag.
Instead, use "align" argument value as object offset to guarantee the
alignment.
Signed-off-by: Shiyong Li <shi-yong.li@xxxxxxxxxxxx <mailto:shi-yong.li@xxxxxxxxxxxx>>
---
mm/slab.c | 7 ++-----
1 files changed, 2 insertions(+), 5 deletions(-)
diff --git a/mm/slab.c b/mm/slab.c
index a8a38ca..84af997 100644
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -2267,9 +2267,6 @@ 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))
- flags &= ~(SLAB_RED_ZONE | SLAB_STORE_USER);
/*
* 4) Store it.
*/
@@ -2289,8 +2286,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);
}

I don't understand what you're trying to do here. What if align is less han sizeof(unsigned long long)? What if SLAB_RED_ZONE is not enabled but SLAB_STORE_USER is?

Pekka
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/