mm/sl[ao]b: always track caller in kmalloc_(node_)track_caller()
Now, we track caller if tracing or slab debugging is enabled. If they are disabled, we could save one argument passing overhead by calling __kmalloc(_node)(). But, I think that it would be marginal. Furthermore, default slab allocator, SLUB, doesn't use this technique so I think that it's okay to change this situation. After this change, we can turn on/off CONFIG_DEBUG_SLAB without full kernel build and remove some complicated '#if' defintion. It looks more benefitial to me. Signed-off-by: Joonsoo Kim <iamjoonsoo.kim@lge.com> Acked-by: Christoph Lameter <cl@linux.com> Cc: Pekka Enberg <penberg@kernel.org> Cc: David Rientjes <rientjes@google.com> Cc: Zhang Yanfei <zhangyanfei@cn.fujitsu.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Родитель
07f361b2be
Коммит
61f47105a2
|
@ -549,37 +549,15 @@ static inline void *kcalloc(size_t n, size_t size, gfp_t flags)
|
||||||
* allocator where we care about the real place the memory allocation
|
* allocator where we care about the real place the memory allocation
|
||||||
* request comes from.
|
* request comes from.
|
||||||
*/
|
*/
|
||||||
#if defined(CONFIG_DEBUG_SLAB) || defined(CONFIG_SLUB) || \
|
|
||||||
(defined(CONFIG_SLAB) && defined(CONFIG_TRACING)) || \
|
|
||||||
(defined(CONFIG_SLOB) && defined(CONFIG_TRACING))
|
|
||||||
extern void *__kmalloc_track_caller(size_t, gfp_t, unsigned long);
|
extern void *__kmalloc_track_caller(size_t, gfp_t, unsigned long);
|
||||||
#define kmalloc_track_caller(size, flags) \
|
#define kmalloc_track_caller(size, flags) \
|
||||||
__kmalloc_track_caller(size, flags, _RET_IP_)
|
__kmalloc_track_caller(size, flags, _RET_IP_)
|
||||||
#else
|
|
||||||
#define kmalloc_track_caller(size, flags) \
|
|
||||||
__kmalloc(size, flags)
|
|
||||||
#endif /* DEBUG_SLAB */
|
|
||||||
|
|
||||||
#ifdef CONFIG_NUMA
|
#ifdef CONFIG_NUMA
|
||||||
/*
|
|
||||||
* kmalloc_node_track_caller is a special version of kmalloc_node that
|
|
||||||
* records the calling function of the routine calling it for slab leak
|
|
||||||
* tracking instead of just the calling function (confusing, eh?).
|
|
||||||
* It's useful when the call to kmalloc_node comes from a widely-used
|
|
||||||
* standard allocator where we care about the real place the memory
|
|
||||||
* allocation request comes from.
|
|
||||||
*/
|
|
||||||
#if defined(CONFIG_DEBUG_SLAB) || defined(CONFIG_SLUB) || \
|
|
||||||
(defined(CONFIG_SLAB) && defined(CONFIG_TRACING)) || \
|
|
||||||
(defined(CONFIG_SLOB) && defined(CONFIG_TRACING))
|
|
||||||
extern void *__kmalloc_node_track_caller(size_t, gfp_t, int, unsigned long);
|
extern void *__kmalloc_node_track_caller(size_t, gfp_t, int, unsigned long);
|
||||||
#define kmalloc_node_track_caller(size, flags, node) \
|
#define kmalloc_node_track_caller(size, flags, node) \
|
||||||
__kmalloc_node_track_caller(size, flags, node, \
|
__kmalloc_node_track_caller(size, flags, node, \
|
||||||
_RET_IP_)
|
_RET_IP_)
|
||||||
#else
|
|
||||||
#define kmalloc_node_track_caller(size, flags, node) \
|
|
||||||
__kmalloc_node(size, flags, node)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else /* CONFIG_NUMA */
|
#else /* CONFIG_NUMA */
|
||||||
|
|
||||||
|
|
18
mm/slab.c
18
mm/slab.c
|
@ -3496,7 +3496,6 @@ __do_kmalloc_node(size_t size, gfp_t flags, int node, unsigned long caller)
|
||||||
return kmem_cache_alloc_node_trace(cachep, flags, node, size);
|
return kmem_cache_alloc_node_trace(cachep, flags, node, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(CONFIG_DEBUG_SLAB) || defined(CONFIG_TRACING)
|
|
||||||
void *__kmalloc_node(size_t size, gfp_t flags, int node)
|
void *__kmalloc_node(size_t size, gfp_t flags, int node)
|
||||||
{
|
{
|
||||||
return __do_kmalloc_node(size, flags, node, _RET_IP_);
|
return __do_kmalloc_node(size, flags, node, _RET_IP_);
|
||||||
|
@ -3509,13 +3508,6 @@ void *__kmalloc_node_track_caller(size_t size, gfp_t flags,
|
||||||
return __do_kmalloc_node(size, flags, node, caller);
|
return __do_kmalloc_node(size, flags, node, caller);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(__kmalloc_node_track_caller);
|
EXPORT_SYMBOL(__kmalloc_node_track_caller);
|
||||||
#else
|
|
||||||
void *__kmalloc_node(size_t size, gfp_t flags, int node)
|
|
||||||
{
|
|
||||||
return __do_kmalloc_node(size, flags, node, 0);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(__kmalloc_node);
|
|
||||||
#endif /* CONFIG_DEBUG_SLAB || CONFIG_TRACING */
|
|
||||||
#endif /* CONFIG_NUMA */
|
#endif /* CONFIG_NUMA */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -3541,8 +3533,6 @@ static __always_inline void *__do_kmalloc(size_t size, gfp_t flags,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if defined(CONFIG_DEBUG_SLAB) || defined(CONFIG_TRACING)
|
|
||||||
void *__kmalloc(size_t size, gfp_t flags)
|
void *__kmalloc(size_t size, gfp_t flags)
|
||||||
{
|
{
|
||||||
return __do_kmalloc(size, flags, _RET_IP_);
|
return __do_kmalloc(size, flags, _RET_IP_);
|
||||||
|
@ -3555,14 +3545,6 @@ void *__kmalloc_track_caller(size_t size, gfp_t flags, unsigned long caller)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(__kmalloc_track_caller);
|
EXPORT_SYMBOL(__kmalloc_track_caller);
|
||||||
|
|
||||||
#else
|
|
||||||
void *__kmalloc(size_t size, gfp_t flags)
|
|
||||||
{
|
|
||||||
return __do_kmalloc(size, flags, 0);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(__kmalloc);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* kmem_cache_free - Deallocate an object
|
* kmem_cache_free - Deallocate an object
|
||||||
* @cachep: The cache the allocation was from.
|
* @cachep: The cache the allocation was from.
|
||||||
|
|
|
@ -468,7 +468,6 @@ void *__kmalloc(size_t size, gfp_t gfp)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(__kmalloc);
|
EXPORT_SYMBOL(__kmalloc);
|
||||||
|
|
||||||
#ifdef CONFIG_TRACING
|
|
||||||
void *__kmalloc_track_caller(size_t size, gfp_t gfp, unsigned long caller)
|
void *__kmalloc_track_caller(size_t size, gfp_t gfp, unsigned long caller)
|
||||||
{
|
{
|
||||||
return __do_kmalloc_node(size, gfp, NUMA_NO_NODE, caller);
|
return __do_kmalloc_node(size, gfp, NUMA_NO_NODE, caller);
|
||||||
|
@ -481,7 +480,6 @@ void *__kmalloc_node_track_caller(size_t size, gfp_t gfp,
|
||||||
return __do_kmalloc_node(size, gfp, node, caller);
|
return __do_kmalloc_node(size, gfp, node, caller);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
|
|
||||||
void kfree(const void *block)
|
void kfree(const void *block)
|
||||||
{
|
{
|
||||||
|
|
Загрузка…
Ссылка в новой задаче