[origin tree build failure] [PATCH] slub: Fix build error inkmem_cache_open() with !CONFIG_SLUB_DEBUG

From: Ingo Molnar
Date: Tue Sep 15 2009 - 05:04:16 EST



* Pekka J Enberg <penberg@xxxxxxxxxxxxxx> wrote:

> Hi Linus,
>
> Here's the usual batch of SLAB allocator fixes and cleanups accumulated
> over the past few months.
>
> Pekka
>
> The following changes since commit 0cc6d77e55eca9557bbe41bf2db94b31aa8fcb2a:
> Linus Torvalds (1):
> Merge branch 'x86-setup-for-linus' of git://git.kernel.org/.../tip/linux-2.6-tip
>
> are available in the git repository at:
>
> ssh://master.kernel.org/pub/scm/linux/kernel/git/penberg/slab-2.6 for-linus
>
> Aaro Koskinen (1):
> SLUB: fix ARCH_KMALLOC_MINALIGN cases 64 and 256
>
> Amerigo Wang (1):
> SLUB: Fix some coding style issues
>
> David Rientjes (2):
> slub: add option to disable higher order debugging slabs
> slub: use size and objsize orders to disable debug flags
>
> Eric Dumazet (1):
> slub: fix slab_pad_check()
>
> Pekka Enberg (1):
> Merge branches 'slab/cleanups' and 'slab/fixes' into for-linus
>
> WANG Cong (1):
> SLUB: Drop write permission to /proc/slabinfo
>
> Wu Fengguang (1):
> slab: remove duplicate kmem_cache_init_late() declarations
>
> Xiaotian Feng (1):
> slub: release kobject if sysfs_create_group failed in sysfs_slab_add
>
> Zhang, Yanmin (1):
> slub: change kmem_cache->align to record the real alignment
>
> Documentation/vm/slub.txt | 10 +++++
> include/linux/slob_def.h | 5 ---
> include/linux/slub_def.h | 8 +---
> mm/slob.c | 5 +++
> mm/slub.c | 82 +++++++++++++++++++++++++++++++++++++--------
> 5 files changed, 85 insertions(+), 25 deletions(-)
>
> diff --git a/Documentation/vm/slub.txt b/Documentation/vm/slub.txt
> index bb1f5c6..510917f 100644
> --- a/Documentation/vm/slub.txt
> +++ b/Documentation/vm/slub.txt
> @@ -41,6 +41,8 @@ Possible debug options are
> P Poisoning (object and padding)
> U User tracking (free and alloc)
> T Trace (please only use on single slabs)
> + O Switch debugging off for caches that would have
> + caused higher minimum slab orders
> - Switch all debugging off (useful if the kernel is
> configured with CONFIG_SLUB_DEBUG_ON)
>
> @@ -59,6 +61,14 @@ to the dentry cache with
>
> slub_debug=F,dentry
>
> +Debugging options may require the minimum possible slab order to increase as
> +a result of storing the metadata (for example, caches with PAGE_SIZE object
> +sizes). This has a higher liklihood of resulting in slab allocation errors
> +in low memory situations or if there's high fragmentation of memory. To
> +switch off debugging for such caches by default, use
> +
> + slub_debug=O
> +
> In case you forgot to enable debugging on the kernel command line: It is
> possible to enable debugging manually when the kernel is up. Look at the
> contents of:
> diff --git a/include/linux/slob_def.h b/include/linux/slob_def.h
> index bb5368d..0ec00b3 100644
> --- a/include/linux/slob_def.h
> +++ b/include/linux/slob_def.h
> @@ -34,9 +34,4 @@ static __always_inline void *__kmalloc(size_t size, gfp_t flags)
> return kmalloc(size, flags);
> }
>
> -static inline void kmem_cache_init_late(void)
> -{
> - /* Nothing to do */
> -}
> -
> #endif /* __LINUX_SLOB_DEF_H */
> diff --git a/include/linux/slub_def.h b/include/linux/slub_def.h
> index c1c862b..5ad70a6 100644
> --- a/include/linux/slub_def.h
> +++ b/include/linux/slub_def.h
> @@ -153,12 +153,10 @@ static __always_inline int kmalloc_index(size_t size)
> if (size <= KMALLOC_MIN_SIZE)
> return KMALLOC_SHIFT_LOW;
>
> -#if KMALLOC_MIN_SIZE <= 64
> - if (size > 64 && size <= 96)
> + if (KMALLOC_MIN_SIZE <= 32 && size > 64 && size <= 96)
> return 1;
> - if (size > 128 && size <= 192)
> + if (KMALLOC_MIN_SIZE <= 64 && size > 128 && size <= 192)
> return 2;
> -#endif
> if (size <= 8) return 3;
> if (size <= 16) return 4;
> if (size <= 32) return 5;
> @@ -304,6 +302,4 @@ static __always_inline void *kmalloc_node(size_t size, gfp_t flags, int node)
> }
> #endif
>
> -void __init kmem_cache_init_late(void);
> -
> #endif /* _LINUX_SLUB_DEF_H */
> diff --git a/mm/slob.c b/mm/slob.c
> index 9641da3..837ebd6 100644
> --- a/mm/slob.c
> +++ b/mm/slob.c
> @@ -692,3 +692,8 @@ void __init kmem_cache_init(void)
> {
> slob_ready = 1;
> }
> +
> +void __init kmem_cache_init_late(void)
> +{
> + /* Nothing to do */
> +}
> diff --git a/mm/slub.c b/mm/slub.c
> index b627675..417ed84 100644
> --- a/mm/slub.c
> +++ b/mm/slub.c
> @@ -141,6 +141,13 @@
> SLAB_POISON | SLAB_STORE_USER)
>
> /*
> + * Debugging flags that require metadata to be stored in the slab. These get
> + * disabled when slub_debug=O is used and a cache's min order increases with
> + * metadata.
> + */
> +#define DEBUG_METADATA_FLAGS (SLAB_RED_ZONE | SLAB_POISON | SLAB_STORE_USER)
> +
> +/*
> * Set of flags that will prevent slab merging
> */
> #define SLUB_NEVER_MERGE (SLAB_RED_ZONE | SLAB_POISON | SLAB_STORE_USER | \
> @@ -325,6 +332,7 @@ static int slub_debug;
> #endif
>
> static char *slub_debug_slabs;
> +static int disable_higher_order_debug;
>
> /*
> * Object debugging
> @@ -646,7 +654,7 @@ static int slab_pad_check(struct kmem_cache *s, struct page *page)
> slab_err(s, page, "Padding overwritten. 0x%p-0x%p", fault, end - 1);
> print_section("Padding", end - remainder, remainder);
>
> - restore_bytes(s, "slab padding", POISON_INUSE, start, end);
> + restore_bytes(s, "slab padding", POISON_INUSE, end - remainder, end);
> return 0;
> }
>
> @@ -976,6 +984,15 @@ static int __init setup_slub_debug(char *str)
> */
> goto check_slabs;
>
> + if (tolower(*str) == 'o') {
> + /*
> + * Avoid enabling debugging on caches if its minimum order
> + * would increase as a result.
> + */
> + disable_higher_order_debug = 1;
> + goto out;
> + }
> +
> slub_debug = 0;
> if (*str == '-')
> /*

fyi, -tip testing found that this broke the build on 64-bit - the fix is
attached below.

Ingo

-------------->