diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-01-30 21:55:38 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-01-30 21:55:38 -0500 |
| 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) | |||
| 75 | * after the module is removed. | 75 | * after the module is removed. |
| 76 | */ | 76 | */ |
| 77 | for (i = 0; i < 10; i++) { | 77 | for (i = 0; i < 10; i++) { |
| 78 | elem = kmalloc(sizeof(*elem), GFP_KERNEL); | 78 | elem = kzalloc(sizeof(*elem), GFP_KERNEL); |
| 79 | pr_info("kmemleak: kmalloc(sizeof(*elem)) = %p\n", elem); | 79 | pr_info("kmemleak: kzalloc(sizeof(*elem)) = %p\n", elem); |
| 80 | if (!elem) | 80 | if (!elem) |
| 81 | return -ENOMEM; | 81 | return -ENOMEM; |
| 82 | memset(elem, 0, sizeof(*elem)); | ||
| 83 | INIT_LIST_HEAD(&elem->list); | 82 | INIT_LIST_HEAD(&elem->list); |
| 84 | |||
| 85 | list_add_tail(&elem->list, &test_list); | 83 | list_add_tail(&elem->list, &test_list); |
| 86 | } | 84 | } |
| 87 | 85 | ||
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 @@ | |||
| 113 | #define BYTES_PER_POINTER sizeof(void *) | 113 | #define BYTES_PER_POINTER sizeof(void *) |
| 114 | 114 | ||
| 115 | /* GFP bitmask for kmemleak internal allocations */ | 115 | /* GFP bitmask for kmemleak internal allocations */ |
| 116 | #define GFP_KMEMLEAK_MASK (GFP_KERNEL | GFP_ATOMIC) | 116 | #define gfp_kmemleak_mask(gfp) (((gfp) & (GFP_KERNEL | GFP_ATOMIC)) | \ |
| 117 | __GFP_NORETRY | __GFP_NOMEMALLOC | \ | ||
| 118 | __GFP_NOWARN) | ||
| 117 | 119 | ||
| 118 | /* scanning area inside a memory block */ | 120 | /* scanning area inside a memory block */ |
| 119 | struct kmemleak_scan_area { | 121 | struct kmemleak_scan_area { |
| @@ -511,9 +513,10 @@ static struct kmemleak_object *create_object(unsigned long ptr, size_t size, | |||
| 511 | struct kmemleak_object *object; | 513 | struct kmemleak_object *object; |
| 512 | struct prio_tree_node *node; | 514 | struct prio_tree_node *node; |
| 513 | 515 | ||
| 514 | object = kmem_cache_alloc(object_cache, gfp & GFP_KMEMLEAK_MASK); | 516 | object = kmem_cache_alloc(object_cache, gfp_kmemleak_mask(gfp)); |
| 515 | if (!object) { | 517 | if (!object) { |
| 516 | kmemleak_stop("Cannot allocate a kmemleak_object structure\n"); | 518 | pr_warning("Cannot allocate a kmemleak_object structure\n"); |
| 519 | kmemleak_disable(); | ||
| 517 | return NULL; | 520 | return NULL; |
| 518 | } | 521 | } |
| 519 | 522 | ||
| @@ -734,9 +737,9 @@ static void add_scan_area(unsigned long ptr, size_t size, gfp_t gfp) | |||
| 734 | return; | 737 | return; |
| 735 | } | 738 | } |
| 736 | 739 | ||
| 737 | area = kmem_cache_alloc(scan_area_cache, gfp & GFP_KMEMLEAK_MASK); | 740 | area = kmem_cache_alloc(scan_area_cache, gfp_kmemleak_mask(gfp)); |
| 738 | if (!area) { | 741 | if (!area) { |
| 739 | kmemleak_warn("Cannot allocate a scan area\n"); | 742 | pr_warning("Cannot allocate a scan area\n"); |
| 740 | goto out; | 743 | goto out; |
| 741 | } | 744 | } |
| 742 | 745 | ||
