|
@@ -10,9 +10,8 @@
|
|
|
#include <linux/gfp.h>
|
|
|
#include <linux/workqueue.h>
|
|
|
#include <linux/kobject.h>
|
|
|
-#include <linux/kmemleak.h>
|
|
|
|
|
|
-#include <trace/events/kmem.h>
|
|
|
+#include <linux/kmemleak.h>
|
|
|
|
|
|
enum stat_item {
|
|
|
ALLOC_FASTPATH, /* Allocation from cpu slab */
|
|
@@ -216,31 +215,40 @@ static __always_inline struct kmem_cache *kmalloc_slab(size_t size)
|
|
|
void *kmem_cache_alloc(struct kmem_cache *, gfp_t);
|
|
|
void *__kmalloc(size_t size, gfp_t flags);
|
|
|
|
|
|
+static __always_inline void *
|
|
|
+kmalloc_order(size_t size, gfp_t flags, unsigned int order)
|
|
|
+{
|
|
|
+ void *ret = (void *) __get_free_pages(flags | __GFP_COMP, order);
|
|
|
+ kmemleak_alloc(ret, size, 1, flags);
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
#ifdef CONFIG_TRACING
|
|
|
-extern void *kmem_cache_alloc_notrace(struct kmem_cache *s, gfp_t gfpflags);
|
|
|
+extern void *
|
|
|
+kmem_cache_alloc_trace(struct kmem_cache *s, gfp_t gfpflags, size_t size);
|
|
|
+extern void *kmalloc_order_trace(size_t size, gfp_t flags, unsigned int order);
|
|
|
#else
|
|
|
static __always_inline void *
|
|
|
-kmem_cache_alloc_notrace(struct kmem_cache *s, gfp_t gfpflags)
|
|
|
+kmem_cache_alloc_trace(struct kmem_cache *s, gfp_t gfpflags, size_t size)
|
|
|
{
|
|
|
return kmem_cache_alloc(s, gfpflags);
|
|
|
}
|
|
|
+
|
|
|
+static __always_inline void *
|
|
|
+kmalloc_order_trace(size_t size, gfp_t flags, unsigned int order)
|
|
|
+{
|
|
|
+ return kmalloc_order(size, flags, order);
|
|
|
+}
|
|
|
#endif
|
|
|
|
|
|
static __always_inline void *kmalloc_large(size_t size, gfp_t flags)
|
|
|
{
|
|
|
unsigned int order = get_order(size);
|
|
|
- void *ret = (void *) __get_free_pages(flags | __GFP_COMP, order);
|
|
|
-
|
|
|
- kmemleak_alloc(ret, size, 1, flags);
|
|
|
- trace_kmalloc(_THIS_IP_, ret, size, PAGE_SIZE << order, flags);
|
|
|
-
|
|
|
- return ret;
|
|
|
+ return kmalloc_order_trace(size, flags, order);
|
|
|
}
|
|
|
|
|
|
static __always_inline void *kmalloc(size_t size, gfp_t flags)
|
|
|
{
|
|
|
- void *ret;
|
|
|
-
|
|
|
if (__builtin_constant_p(size)) {
|
|
|
if (size > SLUB_MAX_SIZE)
|
|
|
return kmalloc_large(size, flags);
|
|
@@ -251,11 +259,7 @@ static __always_inline void *kmalloc(size_t size, gfp_t flags)
|
|
|
if (!s)
|
|
|
return ZERO_SIZE_PTR;
|
|
|
|
|
|
- ret = kmem_cache_alloc_notrace(s, flags);
|
|
|
-
|
|
|
- trace_kmalloc(_THIS_IP_, ret, size, s->size, flags);
|
|
|
-
|
|
|
- return ret;
|
|
|
+ return kmem_cache_alloc_trace(s, flags, size);
|
|
|
}
|
|
|
}
|
|
|
return __kmalloc(size, flags);
|
|
@@ -266,14 +270,14 @@ void *__kmalloc_node(size_t size, gfp_t flags, int node);
|
|
|
void *kmem_cache_alloc_node(struct kmem_cache *, gfp_t flags, int node);
|
|
|
|
|
|
#ifdef CONFIG_TRACING
|
|
|
-extern void *kmem_cache_alloc_node_notrace(struct kmem_cache *s,
|
|
|
+extern void *kmem_cache_alloc_node_trace(struct kmem_cache *s,
|
|
|
gfp_t gfpflags,
|
|
|
- int node);
|
|
|
+ int node, size_t size);
|
|
|
#else
|
|
|
static __always_inline void *
|
|
|
-kmem_cache_alloc_node_notrace(struct kmem_cache *s,
|
|
|
+kmem_cache_alloc_node_trace(struct kmem_cache *s,
|
|
|
gfp_t gfpflags,
|
|
|
- int node)
|
|
|
+ int node, size_t size)
|
|
|
{
|
|
|
return kmem_cache_alloc_node(s, gfpflags, node);
|
|
|
}
|
|
@@ -281,8 +285,6 @@ kmem_cache_alloc_node_notrace(struct kmem_cache *s,
|
|
|
|
|
|
static __always_inline void *kmalloc_node(size_t size, gfp_t flags, int node)
|
|
|
{
|
|
|
- void *ret;
|
|
|
-
|
|
|
if (__builtin_constant_p(size) &&
|
|
|
size <= SLUB_MAX_SIZE && !(flags & SLUB_DMA)) {
|
|
|
struct kmem_cache *s = kmalloc_slab(size);
|
|
@@ -290,12 +292,7 @@ static __always_inline void *kmalloc_node(size_t size, gfp_t flags, int node)
|
|
|
if (!s)
|
|
|
return ZERO_SIZE_PTR;
|
|
|
|
|
|
- ret = kmem_cache_alloc_node_notrace(s, flags, node);
|
|
|
-
|
|
|
- trace_kmalloc_node(_THIS_IP_, ret,
|
|
|
- size, s->size, flags, node);
|
|
|
-
|
|
|
- return ret;
|
|
|
+ return kmem_cache_alloc_node_trace(s, flags, node, size);
|
|
|
}
|
|
|
return __kmalloc_node(size, flags, node);
|
|
|
}
|