[RFC PATCH 3/4] kmemtrace: SLUB hooks.

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Eduard - Gabriel Munteanu
Date: Wednesday, July 16, 2008 - 5:46 pm

This adds hooks for the SLUB allocator, to allow tracing with kmemtrace.

Signed-off-by: Eduard - Gabriel Munteanu <eduard.munteanu@linux360.ro>
---
 include/linux/slub_def.h |    9 +++++++-
 mm/slub.c                |   47 ++++++++++++++++++++++++++++++++++++++++-----
 2 files changed, 49 insertions(+), 7 deletions(-)

diff --git a/include/linux/slub_def.h b/include/linux/slub_def.h
index d117ea2..0cef121 100644
--- a/include/linux/slub_def.h
+++ b/include/linux/slub_def.h
@@ -10,6 +10,7 @@
 #include <linux/gfp.h>
 #include <linux/workqueue.h>
 #include <linux/kobject.h>
+#include <linux/kmemtrace.h>
 
 enum stat_item {
 	ALLOC_FASTPATH,		/* Allocation from cpu slab */
@@ -205,7 +206,13 @@ void *__kmalloc(size_t size, gfp_t flags);
 
 static __always_inline void *kmalloc_large(size_t size, gfp_t flags)
 {
-	return (void *)__get_free_pages(flags | __GFP_COMP, get_order(size));
+	unsigned int order = get_order(size);
+	void *ret = (void *) __get_free_pages(flags, order);
+
+	kmemtrace_mark_alloc(KMEMTRACE_TYPE_KERNEL, _THIS_IP_, ret,
+			     size, PAGE_SIZE << order, flags);
+
+	return ret;
 }
 
 static __always_inline void *kmalloc(size_t size, gfp_t flags)
diff --git a/mm/slub.c b/mm/slub.c
index 315c392..a6f930f 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -23,6 +23,7 @@
 #include <linux/kallsyms.h>
 #include <linux/memory.h>
 #include <linux/math64.h>
+#include <linux/kmemtrace.h>
 
 /*
  * Lock order:
@@ -1652,14 +1653,25 @@ static __always_inline void *slab_alloc(struct kmem_cache *s,
 
 void *kmem_cache_alloc(struct kmem_cache *s, gfp_t gfpflags)
 {
-	return slab_alloc(s, gfpflags, -1, __builtin_return_address(0));
+	void *ret = slab_alloc(s, gfpflags, -1, __builtin_return_address(0));
+
+	kmemtrace_mark_alloc(KMEMTRACE_TYPE_CACHE, _RET_IP_, ret,
+			     s->objsize, s->size, gfpflags);
+
+	return ret;
 }
 EXPORT_SYMBOL(kmem_cache_alloc);
 
 #ifdef CONFIG_NUMA
 void *kmem_cache_alloc_node(struct kmem_cache *s, gfp_t gfpflags, int node)
 {
-	return slab_alloc(s, gfpflags, node, __builtin_return_address(0));
+	void *ret = slab_alloc(s, gfpflags, node,
+			       __builtin_return_address(0));
+
+	kmemtrace_mark_alloc_node(KMEMTRACE_TYPE_CACHE, _RET_IP_, ret,
+				  s->objsize, s->size, gfpflags, node);
+
+	return ret;
 }
 EXPORT_SYMBOL(kmem_cache_alloc_node);
 #endif
@@ -1771,6 +1783,8 @@ void kmem_cache_free(struct kmem_cache *s, void *x)
 	page = virt_to_head_page(x);
 
 	slab_free(s, page, x, __builtin_return_address(0));
+
+	kmemtrace_mark_free(KMEMTRACE_TYPE_CACHE, _RET_IP_, x);
 }
 EXPORT_SYMBOL(kmem_cache_free);
 
@@ -2676,6 +2690,7 @@ static struct kmem_cache *get_slab(size_t size, gfp_t flags)
 void *__kmalloc(size_t size, gfp_t flags)
 {
 	struct kmem_cache *s;
+	void *ret;
 
 	if (unlikely(size > PAGE_SIZE))
 		return kmalloc_large(size, flags);
@@ -2685,7 +2700,12 @@ void *__kmalloc(size_t size, gfp_t flags)
 	if (unlikely(ZERO_OR_NULL_PTR(s)))
 		return s;
 
-	return slab_alloc(s, flags, -1, __builtin_return_address(0));
+	ret = slab_alloc(s, flags, -1, __builtin_return_address(0));
+
+	kmemtrace_mark_alloc(KMEMTRACE_TYPE_KERNEL, _RET_IP_, ret,
+			     size, (size_t) s->size, (unsigned long) flags);
+
+	return ret;
 }
 EXPORT_SYMBOL(__kmalloc);
 
@@ -2704,16 +2724,29 @@ static void *kmalloc_large_node(size_t size, gfp_t flags, int node)
 void *__kmalloc_node(size_t size, gfp_t flags, int node)
 {
 	struct kmem_cache *s;
+	void *ret;
 
-	if (unlikely(size > PAGE_SIZE))
-		return kmalloc_large_node(size, flags, node);
+	if (unlikely(size > PAGE_SIZE)) {
+		ret = kmalloc_large_node(size, flags, node);
+
+		kmemtrace_mark_alloc_node(KMEMTRACE_TYPE_KERNEL, _RET_IP_, ret,
+					  size, PAGE_SIZE << get_order(size),
+					  (unsigned long) flags, node);
+
+		return ret;
+	}
 
 	s = get_slab(size, flags);
 
 	if (unlikely(ZERO_OR_NULL_PTR(s)))
 		return s;
 
-	return slab_alloc(s, flags, node, __builtin_return_address(0));
+	ret = slab_alloc(s, flags, node, __builtin_return_address(0));
+
+	kmemtrace_mark_alloc_node(KMEMTRACE_TYPE_KERNEL, _RET_IP_, ret,
+				  size, s->size, (unsigned long) flags, node);
+
+	return ret;
 }
 EXPORT_SYMBOL(__kmalloc_node);
 #endif
@@ -2771,6 +2804,8 @@ void kfree(const void *x)
 		return;
 	}
 	slab_free(page->slab, page, object, __builtin_return_address(0));
+
+	kmemtrace_mark_free(KMEMTRACE_TYPE_KERNEL, _RET_IP_, x);
 }
 EXPORT_SYMBOL(kfree);
 
-- 
1.5.6.1

--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[RFC PATCH 0/4] kmemtrace RFC (resubmit 1), Eduard - Gabriel Mun ..., (Wed Jul 16, 5:46 pm)
[RFC PATCH 1/4] kmemtrace: Core implementation., Eduard - Gabriel Mun ..., (Wed Jul 16, 5:46 pm)
[RFC PATCH 2/4] kmemtrace: SLAB hooks., Eduard - Gabriel Mun ..., (Wed Jul 16, 5:46 pm)
[RFC PATCH 3/4] kmemtrace: SLUB hooks., Eduard - Gabriel Mun ..., (Wed Jul 16, 5:46 pm)
[RFC PATCH 4/4] kmemtrace: SLOB hooks., Eduard - Gabriel Mun ..., (Wed Jul 16, 5:46 pm)
Re: [RFC PATCH 2/4] kmemtrace: SLAB hooks., Pekka Enberg, (Thu Jul 17, 12:38 am)
Re: [RFC PATCH 4/4] kmemtrace: SLOB hooks., Pekka Enberg, (Thu Jul 17, 12:43 am)
Re: [RFC PATCH 3/4] kmemtrace: SLUB hooks., Pekka Enberg, (Thu Jul 17, 12:46 am)
Re: [RFC PATCH 1/4] kmemtrace: Core implementation., Pekka Enberg, (Thu Jul 17, 1:01 am)
Re: [RFC PATCH 4/4] kmemtrace: SLOB hooks., Matt Mackall, (Thu Jul 17, 8:46 am)
Re: [RFC PATCH 3/4] kmemtrace: SLUB hooks., Eduard - Gabriel Mun ..., (Thu Jul 17, 11:06 am)
Re: [RFC PATCH 1/4] kmemtrace: Core implementation., Eduard - Gabriel Mun ..., (Thu Jul 17, 11:32 am)
Re: [RFC PATCH 1/4] kmemtrace: Core implementation., Randy Dunlap, (Thu Jul 17, 2:34 pm)
Re: [RFC PATCH 1/4] kmemtrace: Core implementation., Eduard - Gabriel Mun ..., (Thu Jul 17, 4:49 pm)
Re: [RFC PATCH 1/4] kmemtrace: Core implementation., Pekka J Enberg, (Fri Jul 18, 1:48 am)
Re: [RFC PATCH 1/4] kmemtrace: Core implementation., Eduard - Gabriel Mun ..., (Fri Jul 18, 3:13 am)
Re: [RFC PATCH 1/4] kmemtrace: Core implementation., Pekka Enberg, (Fri Jul 18, 7:38 am)
Re: [RFC PATCH 1/4] kmemtrace: Core implementation., Eduard - Gabriel Mun ..., (Fri Jul 18, 12:40 pm)
Re: [RFC PATCH 1/4] kmemtrace: Core implementation., Matt Mackall, (Fri Jul 18, 1:07 pm)