diff options
| author | 2014-11-19 21:32:12 +1100 | |
|---|---|---|
| committer | 2014-11-19 21:32:12 +1100 | |
| commit | b10778a00d40b3d9fdaaf5891e802794781ff71c (patch) | |
| tree | 6ba4cbac86eecedc3f30650e7f764ecf00c83898 /mm/slab_common.c | |
| parent | integrity: do zero padding of the key id (diff) | |
| parent | Linux 3.17 (diff) | |
| download | wireguard-linux-b10778a00d40b3d9fdaaf5891e802794781ff71c.tar.xz wireguard-linux-b10778a00d40b3d9fdaaf5891e802794781ff71c.zip | |
Merge commit 'v3.17' into next
Diffstat (limited to '')
| -rw-r--r-- | mm/slab_common.c | 101 | 
1 files changed, 101 insertions, 0 deletions
| diff --git a/mm/slab_common.c b/mm/slab_common.c index d31c4bacc6a2..d319502b2403 100644 --- a/mm/slab_common.c +++ b/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); | 
