Commit e21827aa authored by Ezequiel Garcia's avatar Ezequiel Garcia Committed by Pekka Enberg

mm: Use __do_krealloc to do the krealloc job

Without this patch we can get (many) kmem trace events
with call site at krealloc().

This happens because krealloc is calling __krealloc,
which performs the allocation through kmalloc_track_caller.

Since neither krealloc nor __krealloc are marked inline explicitly,
the caller can be traced as being krealloc, which clearly is not
the intended behavior.

This patch allows to get the real caller of krealloc, by creating
an always inlined function __do_krealloc, thus tracing the
call site accurately.
Acked-by: default avatarChristoph Lameter <cl@linux.com>
Cc: Glauber Costa <glommer@parallels.com>
Signed-off-by: default avatarEzequiel Garcia <elezegarcia@gmail.com>
Signed-off-by: default avatarPekka Enberg <penberg@kernel.org>
parent 5b74beb4
...@@ -105,6 +105,25 @@ void *memdup_user(const void __user *src, size_t len) ...@@ -105,6 +105,25 @@ 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. * __krealloc - like krealloc() but don't free @p.
* @p: object to reallocate memory for. * @p: object to reallocate memory for.
...@@ -117,23 +136,11 @@ EXPORT_SYMBOL(memdup_user); ...@@ -117,23 +136,11 @@ EXPORT_SYMBOL(memdup_user);
*/ */
void *__krealloc(const void *p, size_t new_size, gfp_t flags) void *__krealloc(const void *p, size_t new_size, gfp_t flags)
{ {
void *ret;
size_t ks = 0;
if (unlikely(!new_size)) if (unlikely(!new_size))
return ZERO_SIZE_PTR; return ZERO_SIZE_PTR;
if (p) return __do_krealloc(p, new_size, flags);
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;
} }
EXPORT_SYMBOL(__krealloc); EXPORT_SYMBOL(__krealloc);
...@@ -157,7 +164,7 @@ void *krealloc(const void *p, size_t new_size, gfp_t flags) ...@@ -157,7 +164,7 @@ void *krealloc(const void *p, size_t new_size, gfp_t flags)
return ZERO_SIZE_PTR; return ZERO_SIZE_PTR;
} }
ret = __krealloc(p, new_size, flags); ret = __do_krealloc(p, new_size, flags);
if (ret && p != ret) if (ret && p != ret)
kfree(p); kfree(p);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment