Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5c5e3b33 authored by Shiyong Li's avatar Shiyong Li Committed by Pekka Enberg
Browse files

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: default avatarShiyong Li <shi-yong.li@motorola.com>
Signed-off-by: default avatarPekka Enberg <penberg@cs.helsinki.fi>
parent 0d0fb0f9
Loading
Loading
Loading
Loading
+4 −4
Original line number Original line Diff line number Diff line
@@ -2220,8 +2220,8 @@ kmem_cache_create (const char *name, size_t size, size_t align,
	if (ralign < align) {
	if (ralign < align) {
		ralign = align;
		ralign = align;
	}
	}
	/* disable debug if necessary */
	/* disable debug if not aligning with REDZONE_ALIGN */
	if (ralign > __alignof__(unsigned long long))
	if (ralign & (__alignof__(unsigned long long) - 1))
		flags &= ~(SLAB_RED_ZONE | SLAB_STORE_USER);
		flags &= ~(SLAB_RED_ZONE | SLAB_STORE_USER);
	/*
	/*
	 * 4) Store it.
	 * 4) Store it.
@@ -2247,8 +2247,8 @@ kmem_cache_create (const char *name, size_t size, size_t align,
	 */
	 */
	if (flags & SLAB_RED_ZONE) {
	if (flags & SLAB_RED_ZONE) {
		/* add space for red zone words */
		/* add space for red zone words */
		cachep->obj_offset += sizeof(unsigned long long);
		cachep->obj_offset += align;
		size += 2 * sizeof(unsigned long long);
		size += align + sizeof(unsigned long long);
	}
	}
	if (flags & SLAB_STORE_USER) {
	if (flags & SLAB_STORE_USER) {
		/* user store requires one word storage behind the end of
		/* user store requires one word storage behind the end of