diff options
| author | Catalin Marinas <catalin.marinas@arm.com> | 2009-07-07 05:32:59 -0400 |
|---|---|---|
| committer | Catalin Marinas <catalin.marinas@arm.com> | 2009-07-08 09:25:14 -0400 |
| commit | e4f7c0b44a8ac8935f223195af9ea637d0c08091 (patch) | |
| tree | 9d8627800137ae50a1d5707c21489969c77c9e8a | |
| parent | 2587362eaf5c9df4e08de11e6340e3c4a88ed4c8 (diff) | |
kmemleak: Trace the kmalloc_large* functions in slub
The kmalloc_large() and kmalloc_large_node() functions were missed when
adding the kmemleak hooks to the slub allocator. However, they should be
traced to avoid false positives.
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Cc: Christoph Lameter <cl@linux-foundation.org>
Acked-by: Pekka Enberg <penberg@cs.helsinki.fi>
| -rw-r--r-- | include/linux/slub_def.h | 2 | ||||
| -rw-r--r-- | mm/slub.c | 10 |
2 files changed, 8 insertions, 4 deletions
diff --git a/include/linux/slub_def.h b/include/linux/slub_def.h index 4dcbc2c71491..c1c862b1d01a 100644 --- a/include/linux/slub_def.h +++ b/include/linux/slub_def.h | |||
| @@ -11,6 +11,7 @@ | |||
| 11 | #include <linux/workqueue.h> | 11 | #include <linux/workqueue.h> |
| 12 | #include <linux/kobject.h> | 12 | #include <linux/kobject.h> |
| 13 | #include <linux/kmemtrace.h> | 13 | #include <linux/kmemtrace.h> |
| 14 | #include <linux/kmemleak.h> | ||
| 14 | 15 | ||
| 15 | enum stat_item { | 16 | enum stat_item { |
| 16 | ALLOC_FASTPATH, /* Allocation from cpu slab */ | 17 | ALLOC_FASTPATH, /* Allocation from cpu slab */ |
| @@ -233,6 +234,7 @@ static __always_inline void *kmalloc_large(size_t size, gfp_t flags) | |||
| 233 | unsigned int order = get_order(size); | 234 | unsigned int order = get_order(size); |
| 234 | void *ret = (void *) __get_free_pages(flags | __GFP_COMP, order); | 235 | void *ret = (void *) __get_free_pages(flags | __GFP_COMP, order); |
| 235 | 236 | ||
| 237 | kmemleak_alloc(ret, size, 1, flags); | ||
| 236 | trace_kmalloc(_THIS_IP_, ret, size, PAGE_SIZE << order, flags); | 238 | trace_kmalloc(_THIS_IP_, ret, size, PAGE_SIZE << order, flags); |
| 237 | 239 | ||
| 238 | return ret; | 240 | return ret; |
| @@ -21,7 +21,6 @@ | |||
| 21 | #include <linux/kmemcheck.h> | 21 | #include <linux/kmemcheck.h> |
| 22 | #include <linux/cpu.h> | 22 | #include <linux/cpu.h> |
| 23 | #include <linux/cpuset.h> | 23 | #include <linux/cpuset.h> |
| 24 | #include <linux/kmemleak.h> | ||
| 25 | #include <linux/mempolicy.h> | 24 | #include <linux/mempolicy.h> |
| 26 | #include <linux/ctype.h> | 25 | #include <linux/ctype.h> |
| 27 | #include <linux/debugobjects.h> | 26 | #include <linux/debugobjects.h> |
| @@ -2835,13 +2834,15 @@ EXPORT_SYMBOL(__kmalloc); | |||
| 2835 | static void *kmalloc_large_node(size_t size, gfp_t flags, int node) | 2834 | static void *kmalloc_large_node(size_t size, gfp_t flags, int node) |
| 2836 | { | 2835 | { |
| 2837 | struct page *page; | 2836 | struct page *page; |
| 2837 | void *ptr = NULL; | ||
| 2838 | 2838 | ||
| 2839 | flags |= __GFP_COMP | __GFP_NOTRACK; | 2839 | flags |= __GFP_COMP | __GFP_NOTRACK; |
| 2840 | page = alloc_pages_node(node, flags, get_order(size)); | 2840 | page = alloc_pages_node(node, flags, get_order(size)); |
| 2841 | if (page) | 2841 | if (page) |
| 2842 | return page_address(page); | 2842 | ptr = page_address(page); |
| 2843 | else | 2843 | |
| 2844 | return NULL; | 2844 | kmemleak_alloc(ptr, size, 1, flags); |
| 2845 | return ptr; | ||
| 2845 | } | 2846 | } |
| 2846 | 2847 | ||
| 2847 | #ifdef CONFIG_NUMA | 2848 | #ifdef CONFIG_NUMA |
| @@ -2926,6 +2927,7 @@ void kfree(const void *x) | |||
| 2926 | page = virt_to_head_page(x); | 2927 | page = virt_to_head_page(x); |
| 2927 | if (unlikely(!PageSlab(page))) { | 2928 | if (unlikely(!PageSlab(page))) { |
| 2928 | BUG_ON(!PageCompound(page)); | 2929 | BUG_ON(!PageCompound(page)); |
| 2930 | kmemleak_free(x); | ||
| 2929 | put_page(page); | 2931 | put_page(page); |
| 2930 | return; | 2932 | return; |
| 2931 | } | 2933 | } |
