-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This patch adds the base support for the kernel memory leak detector. It traces the memory allocation/freeing in a way similar to the Boehm's conservative garbage collector, the difference being that the unreferenced objects are not freed but only shown in /sys/kernel/debug/kmemleak. Enabling this feature introduces an overhead to memory allocations. Signed-off-by: Catalin Marinas <catalin.marinas@arm.com> Cc: Ingo Molnar <mingo@elte.hu> Acked-by: Pekka Enberg <penberg@cs.helsinki.fi> Cc: Andrew Morton <akpm@linux-foundation.org> Reviewed-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
- Loading branch information
Catalin Marinas
committed
Jun 11, 2009
1 parent
991ec02
commit 3c7b4e6
Showing
3 changed files
with
1,597 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,96 @@ | ||
/* | ||
* include/linux/kmemleak.h | ||
* | ||
* Copyright (C) 2008 ARM Limited | ||
* Written by Catalin Marinas <catalin.marinas@arm.com> | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; if not, write to the Free Software | ||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
*/ | ||
|
||
#ifndef __KMEMLEAK_H | ||
#define __KMEMLEAK_H | ||
|
||
#ifdef CONFIG_DEBUG_KMEMLEAK | ||
|
||
extern void kmemleak_init(void); | ||
extern void kmemleak_alloc(const void *ptr, size_t size, int min_count, | ||
gfp_t gfp); | ||
extern void kmemleak_free(const void *ptr); | ||
extern void kmemleak_padding(const void *ptr, unsigned long offset, | ||
size_t size); | ||
extern void kmemleak_not_leak(const void *ptr); | ||
extern void kmemleak_ignore(const void *ptr); | ||
extern void kmemleak_scan_area(const void *ptr, unsigned long offset, | ||
size_t length, gfp_t gfp); | ||
extern void kmemleak_no_scan(const void *ptr); | ||
|
||
static inline void kmemleak_alloc_recursive(const void *ptr, size_t size, | ||
int min_count, unsigned long flags, | ||
gfp_t gfp) | ||
{ | ||
if (!(flags & SLAB_NOLEAKTRACE)) | ||
kmemleak_alloc(ptr, size, min_count, gfp); | ||
} | ||
|
||
static inline void kmemleak_free_recursive(const void *ptr, unsigned long flags) | ||
{ | ||
if (!(flags & SLAB_NOLEAKTRACE)) | ||
kmemleak_free(ptr); | ||
} | ||
|
||
static inline void kmemleak_erase(void **ptr) | ||
{ | ||
*ptr = NULL; | ||
} | ||
|
||
#else | ||
|
||
static inline void kmemleak_init(void) | ||
{ | ||
} | ||
static inline void kmemleak_alloc(const void *ptr, size_t size, int min_count, | ||
gfp_t gfp) | ||
{ | ||
} | ||
static inline void kmemleak_alloc_recursive(const void *ptr, size_t size, | ||
int min_count, unsigned long flags, | ||
gfp_t gfp) | ||
{ | ||
} | ||
static inline void kmemleak_free(const void *ptr) | ||
{ | ||
} | ||
static inline void kmemleak_free_recursive(const void *ptr, unsigned long flags) | ||
{ | ||
} | ||
static inline void kmemleak_not_leak(const void *ptr) | ||
{ | ||
} | ||
static inline void kmemleak_ignore(const void *ptr) | ||
{ | ||
} | ||
static inline void kmemleak_scan_area(const void *ptr, unsigned long offset, | ||
size_t length, gfp_t gfp) | ||
{ | ||
} | ||
static inline void kmemleak_erase(void **ptr) | ||
{ | ||
} | ||
static inline void kmemleak_no_scan(const void *ptr) | ||
{ | ||
} | ||
|
||
#endif /* CONFIG_DEBUG_KMEMLEAK */ | ||
|
||
#endif /* __KMEMLEAK_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.