mm: move slab related stuff from util.c to slab_common.c
Functions krealloc(), __krealloc(), kzfree() belongs to slab API, so should be placed in slab_common.c Also move slab allocator's tracepoints defenitions to slab_common.c No functional changes here. Signed-off-by: Andrey Ryabinin <a.ryabinin@samsung.com> Acked-by: Christoph Lameter <cl@linux.com> Cc: Pekka Enberg <penberg@kernel.org> Cc: David Rientjes <rientjes@google.com> Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
5426664070
commit
928cec9cd6
101
mm/slab_common.c
101
mm/slab_common.c
|
@ -19,6 +19,8 @@
|
||||||
#include <asm/tlbflush.h>
|
#include <asm/tlbflush.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
#include <linux/memcontrol.h>
|
#include <linux/memcontrol.h>
|
||||||
|
|
||||||
|
#define CREATE_TRACE_POINTS
|
||||||
#include <trace/events/kmem.h>
|
#include <trace/events/kmem.h>
|
||||||
|
|
||||||
#include "slab.h"
|
#include "slab.h"
|
||||||
|
@ -787,3 +789,102 @@ static int __init slab_proc_init(void)
|
||||||
}
|
}
|
||||||
module_init(slab_proc_init);
|
module_init(slab_proc_init);
|
||||||
#endif /* CONFIG_SLABINFO */
|
#endif /* CONFIG_SLABINFO */
|
||||||
|
|
||||||
|
static __always_inline void *__do_krealloc(const void *p, size_t new_size,
|
||||||
|
gfp_t flags)
|
||||||
|
{
|
||||||
|
void *ret;
|
||||||
|
size_t ks = 0;
|
||||||
|
|
||||||
|
if (p)
|
||||||
|
ks = ksize(p);
|
||||||
|
|
||||||
|
if (ks >= new_size)
|
||||||
|
return (void *)p;
|
||||||
|
|
||||||
|
ret = kmalloc_track_caller(new_size, flags);
|
||||||
|
if (ret && p)
|
||||||
|
memcpy(ret, p, ks);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* __krealloc - like krealloc() but don't free @p.
|
||||||
|
* @p: object to reallocate memory for.
|
||||||
|
* @new_size: how many bytes of memory are required.
|
||||||
|
* @flags: the type of memory to allocate.
|
||||||
|
*
|
||||||
|
* This function is like krealloc() except it never frees the originally
|
||||||
|
* allocated buffer. Use this if you don't want to free the buffer immediately
|
||||||
|
* like, for example, with RCU.
|
||||||
|
*/
|
||||||
|
void *__krealloc(const void *p, size_t new_size, gfp_t flags)
|
||||||
|
{
|
||||||
|
if (unlikely(!new_size))
|
||||||
|
return ZERO_SIZE_PTR;
|
||||||
|
|
||||||
|
return __do_krealloc(p, new_size, flags);
|
||||||
|
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(__krealloc);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* krealloc - reallocate memory. The contents will remain unchanged.
|
||||||
|
* @p: object to reallocate memory for.
|
||||||
|
* @new_size: how many bytes of memory are required.
|
||||||
|
* @flags: the type of memory to allocate.
|
||||||
|
*
|
||||||
|
* The contents of the object pointed to are preserved up to the
|
||||||
|
* lesser of the new and old sizes. If @p is %NULL, krealloc()
|
||||||
|
* behaves exactly like kmalloc(). If @new_size is 0 and @p is not a
|
||||||
|
* %NULL pointer, the object pointed to is freed.
|
||||||
|
*/
|
||||||
|
void *krealloc(const void *p, size_t new_size, gfp_t flags)
|
||||||
|
{
|
||||||
|
void *ret;
|
||||||
|
|
||||||
|
if (unlikely(!new_size)) {
|
||||||
|
kfree(p);
|
||||||
|
return ZERO_SIZE_PTR;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = __do_krealloc(p, new_size, flags);
|
||||||
|
if (ret && p != ret)
|
||||||
|
kfree(p);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(krealloc);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* kzfree - like kfree but zero memory
|
||||||
|
* @p: object to free memory of
|
||||||
|
*
|
||||||
|
* The memory of the object @p points to is zeroed before freed.
|
||||||
|
* If @p is %NULL, kzfree() does nothing.
|
||||||
|
*
|
||||||
|
* Note: this function zeroes the whole allocated buffer which can be a good
|
||||||
|
* deal bigger than the requested buffer size passed to kmalloc(). So be
|
||||||
|
* careful when using this function in performance sensitive code.
|
||||||
|
*/
|
||||||
|
void kzfree(const void *p)
|
||||||
|
{
|
||||||
|
size_t ks;
|
||||||
|
void *mem = (void *)p;
|
||||||
|
|
||||||
|
if (unlikely(ZERO_OR_NULL_PTR(mem)))
|
||||||
|
return;
|
||||||
|
ks = ksize(mem);
|
||||||
|
memset(mem, 0, ks);
|
||||||
|
kfree(mem);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(kzfree);
|
||||||
|
|
||||||
|
/* Tracepoints definitions. */
|
||||||
|
EXPORT_TRACEPOINT_SYMBOL(kmalloc);
|
||||||
|
EXPORT_TRACEPOINT_SYMBOL(kmem_cache_alloc);
|
||||||
|
EXPORT_TRACEPOINT_SYMBOL(kmalloc_node);
|
||||||
|
EXPORT_TRACEPOINT_SYMBOL(kmem_cache_alloc_node);
|
||||||
|
EXPORT_TRACEPOINT_SYMBOL(kfree);
|
||||||
|
EXPORT_TRACEPOINT_SYMBOL(kmem_cache_free);
|
||||||
|
|
102
mm/util.c
102
mm/util.c
|
@ -16,9 +16,6 @@
|
||||||
|
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
|
||||||
#define CREATE_TRACE_POINTS
|
|
||||||
#include <trace/events/kmem.h>
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* kstrdup - allocate space for and copy an existing string
|
* kstrdup - allocate space for and copy an existing string
|
||||||
* @s: the string to duplicate
|
* @s: the string to duplicate
|
||||||
|
@ -112,97 +109,6 @@ void *memdup_user(const void __user *src, size_t len)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(memdup_user);
|
EXPORT_SYMBOL(memdup_user);
|
||||||
|
|
||||||
static __always_inline void *__do_krealloc(const void *p, size_t new_size,
|
|
||||||
gfp_t flags)
|
|
||||||
{
|
|
||||||
void *ret;
|
|
||||||
size_t ks = 0;
|
|
||||||
|
|
||||||
if (p)
|
|
||||||
ks = ksize(p);
|
|
||||||
|
|
||||||
if (ks >= new_size)
|
|
||||||
return (void *)p;
|
|
||||||
|
|
||||||
ret = kmalloc_track_caller(new_size, flags);
|
|
||||||
if (ret && p)
|
|
||||||
memcpy(ret, p, ks);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* __krealloc - like krealloc() but don't free @p.
|
|
||||||
* @p: object to reallocate memory for.
|
|
||||||
* @new_size: how many bytes of memory are required.
|
|
||||||
* @flags: the type of memory to allocate.
|
|
||||||
*
|
|
||||||
* This function is like krealloc() except it never frees the originally
|
|
||||||
* allocated buffer. Use this if you don't want to free the buffer immediately
|
|
||||||
* like, for example, with RCU.
|
|
||||||
*/
|
|
||||||
void *__krealloc(const void *p, size_t new_size, gfp_t flags)
|
|
||||||
{
|
|
||||||
if (unlikely(!new_size))
|
|
||||||
return ZERO_SIZE_PTR;
|
|
||||||
|
|
||||||
return __do_krealloc(p, new_size, flags);
|
|
||||||
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(__krealloc);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* krealloc - reallocate memory. The contents will remain unchanged.
|
|
||||||
* @p: object to reallocate memory for.
|
|
||||||
* @new_size: how many bytes of memory are required.
|
|
||||||
* @flags: the type of memory to allocate.
|
|
||||||
*
|
|
||||||
* The contents of the object pointed to are preserved up to the
|
|
||||||
* lesser of the new and old sizes. If @p is %NULL, krealloc()
|
|
||||||
* behaves exactly like kmalloc(). If @new_size is 0 and @p is not a
|
|
||||||
* %NULL pointer, the object pointed to is freed.
|
|
||||||
*/
|
|
||||||
void *krealloc(const void *p, size_t new_size, gfp_t flags)
|
|
||||||
{
|
|
||||||
void *ret;
|
|
||||||
|
|
||||||
if (unlikely(!new_size)) {
|
|
||||||
kfree(p);
|
|
||||||
return ZERO_SIZE_PTR;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = __do_krealloc(p, new_size, flags);
|
|
||||||
if (ret && p != ret)
|
|
||||||
kfree(p);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(krealloc);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* kzfree - like kfree but zero memory
|
|
||||||
* @p: object to free memory of
|
|
||||||
*
|
|
||||||
* The memory of the object @p points to is zeroed before freed.
|
|
||||||
* If @p is %NULL, kzfree() does nothing.
|
|
||||||
*
|
|
||||||
* Note: this function zeroes the whole allocated buffer which can be a good
|
|
||||||
* deal bigger than the requested buffer size passed to kmalloc(). So be
|
|
||||||
* careful when using this function in performance sensitive code.
|
|
||||||
*/
|
|
||||||
void kzfree(const void *p)
|
|
||||||
{
|
|
||||||
size_t ks;
|
|
||||||
void *mem = (void *)p;
|
|
||||||
|
|
||||||
if (unlikely(ZERO_OR_NULL_PTR(mem)))
|
|
||||||
return;
|
|
||||||
ks = ksize(mem);
|
|
||||||
memset(mem, 0, ks);
|
|
||||||
kfree(mem);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(kzfree);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* strndup_user - duplicate an existing string from user space
|
* strndup_user - duplicate an existing string from user space
|
||||||
* @s: The string to duplicate
|
* @s: The string to duplicate
|
||||||
|
@ -504,11 +410,3 @@ out_mm:
|
||||||
out:
|
out:
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Tracepoints definitions. */
|
|
||||||
EXPORT_TRACEPOINT_SYMBOL(kmalloc);
|
|
||||||
EXPORT_TRACEPOINT_SYMBOL(kmem_cache_alloc);
|
|
||||||
EXPORT_TRACEPOINT_SYMBOL(kmalloc_node);
|
|
||||||
EXPORT_TRACEPOINT_SYMBOL(kmem_cache_alloc_node);
|
|
||||||
EXPORT_TRACEPOINT_SYMBOL(kfree);
|
|
||||||
EXPORT_TRACEPOINT_SYMBOL(kmem_cache_free);
|
|
||||||
|
|
Loading…
Reference in New Issue