diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-01-31 12:55:38 +1000 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-01-31 12:55:38 +1000 | 
| commit | 4fda116852fe21a3897c478ce64b77bb1ec6b3d6 (patch) | |
| tree | ae1dbc17d1223ba0debe3ca7f309e2eca82b6447 | |
| parent | 52cea8a4b0634421ddafcfef98c07cf5c378a71f (diff) | |
| parent | 6ae4bd1f0bc479984f30061b5e5116060c24a267 (diff) | |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/cmarinas/linux-2.6-cm
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/cmarinas/linux-2.6-cm:
  kmemleak: Allow kmemleak metadata allocations to fail
  kmemleak: remove memset by using kzalloc
| -rw-r--r-- | mm/kmemleak-test.c | 6 | ||||
| -rw-r--r-- | mm/kmemleak.c | 13 | 
2 files changed, 10 insertions, 9 deletions
| diff --git a/mm/kmemleak-test.c b/mm/kmemleak-test.c index 177a5169bbde..ff0d9779cec8 100644 --- a/mm/kmemleak-test.c +++ b/mm/kmemleak-test.c @@ -75,13 +75,11 @@ static int __init kmemleak_test_init(void)  	 * after the module is removed.  	 */  	for (i = 0; i < 10; i++) { -		elem = kmalloc(sizeof(*elem), GFP_KERNEL); -		pr_info("kmemleak: kmalloc(sizeof(*elem)) = %p\n", elem); +		elem = kzalloc(sizeof(*elem), GFP_KERNEL); +		pr_info("kmemleak: kzalloc(sizeof(*elem)) = %p\n", elem);  		if (!elem)  			return -ENOMEM; -		memset(elem, 0, sizeof(*elem));  		INIT_LIST_HEAD(&elem->list); -  		list_add_tail(&elem->list, &test_list);  	} diff --git a/mm/kmemleak.c b/mm/kmemleak.c index bd9bc214091b..84225f3b7190 100644 --- a/mm/kmemleak.c +++ b/mm/kmemleak.c @@ -113,7 +113,9 @@  #define BYTES_PER_POINTER	sizeof(void *)  /* GFP bitmask for kmemleak internal allocations */ -#define GFP_KMEMLEAK_MASK	(GFP_KERNEL | GFP_ATOMIC) +#define gfp_kmemleak_mask(gfp)	(((gfp) & (GFP_KERNEL | GFP_ATOMIC)) | \ +				 __GFP_NORETRY | __GFP_NOMEMALLOC | \ +				 __GFP_NOWARN)  /* scanning area inside a memory block */  struct kmemleak_scan_area { @@ -511,9 +513,10 @@ static struct kmemleak_object *create_object(unsigned long ptr, size_t size,  	struct kmemleak_object *object;  	struct prio_tree_node *node; -	object = kmem_cache_alloc(object_cache, gfp & GFP_KMEMLEAK_MASK); +	object = kmem_cache_alloc(object_cache, gfp_kmemleak_mask(gfp));  	if (!object) { -		kmemleak_stop("Cannot allocate a kmemleak_object structure\n"); +		pr_warning("Cannot allocate a kmemleak_object structure\n"); +		kmemleak_disable();  		return NULL;  	} @@ -734,9 +737,9 @@ static void add_scan_area(unsigned long ptr, size_t size, gfp_t gfp)  		return;  	} -	area = kmem_cache_alloc(scan_area_cache, gfp & GFP_KMEMLEAK_MASK); +	area = kmem_cache_alloc(scan_area_cache, gfp_kmemleak_mask(gfp));  	if (!area) { -		kmemleak_warn("Cannot allocate a scan area\n"); +		pr_warning("Cannot allocate a scan area\n");  		goto out;  	} | 
