Prev: [GIT PULL v3] perf fixes
Next: Fix missing of last user info while getting DEBUG_SLAB config enabled
From: Pekka Enberg on 1 Apr 2010 02:40 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(a)motorola.com > <mailto:shi-yong.li(a)motorola.com>> > 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(a)motorola.com > <mailto:shi-yong.li(a)motorola.com>> > --- > 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(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ |