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/page.h>
|
||||
#include <linux/memcontrol.h>
|
||||
|
||||
#define CREATE_TRACE_POINTS
|
||||
#include <trace/events/kmem.h>
|
||||
|
||||
#include "slab.h"
|
||||
@ -787,3 +789,102 @@ static int __init slab_proc_init(void)
|
||||
}
|
||||
module_init(slab_proc_init);
|
||||
#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"
|
||||
|
||||
#define CREATE_TRACE_POINTS
|
||||
#include <trace/events/kmem.h>
|
||||
|
||||
/**
|
||||
* kstrdup - allocate space for and copy an existing string
|
||||
* @s: the string to duplicate
|
||||
@ -112,97 +109,6 @@ void *memdup_user(const void __user *src, size_t len)
|
||||
}
|
||||
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
|
||||
* @s: The string to duplicate
|
||||
@ -504,11 +410,3 @@ out_mm:
|
||||
out:
|
||||
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
Block a user