diff options
Diffstat (limited to 'mm/slub.c')
| -rw-r--r-- | mm/slub.c | 49 | 
1 files changed, 26 insertions, 23 deletions
| diff --git a/mm/slub.c b/mm/slub.c index d2f343a54bad..217b5b5338a2 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -797,10 +797,34 @@ static inline int slab_pre_alloc_hook(struct kmem_cache *s, gfp_t flags)  	return should_failslab(s->objsize, flags, s->flags);  } +static inline size_t slab_ksize(const struct kmem_cache *s) +{ +#ifdef CONFIG_SLUB_DEBUG +	/* +	 * Debugging requires use of the padding between object +	 * and whatever may come after it. +	 */ +	if (s->flags & (SLAB_RED_ZONE | SLAB_POISON)) +		return s->objsize; + +#endif +	/* +	 * If we have the need to store the freelist pointer +	 * back there or track user information then we can +	 * only use the space before that information. +	 */ +	if (s->flags & (SLAB_DESTROY_BY_RCU | SLAB_STORE_USER)) +		return s->inuse; +	/* +	 * Else we can use all the padding etc for the allocation +	 */ +	return s->size; +} +  static inline void slab_post_alloc_hook(struct kmem_cache *s, gfp_t flags, void *object)  {  	flags &= gfp_allowed_mask; -	kmemcheck_slab_alloc(s, flags, object, s->objsize); +	kmemcheck_slab_alloc(s, flags, object, slab_ksize(s));  	kmemleak_alloc_recursive(object, s->objsize, 1, s->flags, flags);  } @@ -2690,7 +2714,6 @@ EXPORT_SYMBOL(__kmalloc_node);  size_t ksize(const void *object)  {  	struct page *page; -	struct kmem_cache *s;  	if (unlikely(object == ZERO_SIZE_PTR))  		return 0; @@ -2701,28 +2724,8 @@ size_t ksize(const void *object)  		WARN_ON(!PageCompound(page));  		return PAGE_SIZE << compound_order(page);  	} -	s = page->slab; -#ifdef CONFIG_SLUB_DEBUG -	/* -	 * Debugging requires use of the padding between object -	 * and whatever may come after it. -	 */ -	if (s->flags & (SLAB_RED_ZONE | SLAB_POISON)) -		return s->objsize; - -#endif -	/* -	 * If we have the need to store the freelist pointer -	 * back there or track user information then we can -	 * only use the space before that information. -	 */ -	if (s->flags & (SLAB_DESTROY_BY_RCU | SLAB_STORE_USER)) -		return s->inuse; -	/* -	 * Else we can use all the padding etc for the allocation -	 */ -	return s->size; +	return slab_ksize(page->slab);  }  EXPORT_SYMBOL(ksize); | 
