|
@@ -359,6 +359,12 @@ static struct vmap_area *alloc_vmap_area(unsigned long size,
|
|
|
if (unlikely(!va))
|
|
|
return ERR_PTR(-ENOMEM);
|
|
|
|
|
|
+ /*
|
|
|
+ * Only scan the relevant parts containing pointers to other objects
|
|
|
+ * to avoid false negatives.
|
|
|
+ */
|
|
|
+ kmemleak_scan_area(&va->rb_node, SIZE_MAX, gfp_mask & GFP_RECLAIM_MASK);
|
|
|
+
|
|
|
retry:
|
|
|
spin_lock(&vmap_area_lock);
|
|
|
/*
|
|
@@ -1645,11 +1651,11 @@ void *__vmalloc_node_range(unsigned long size, unsigned long align,
|
|
|
clear_vm_uninitialized_flag(area);
|
|
|
|
|
|
/*
|
|
|
- * A ref_count = 3 is needed because the vm_struct and vmap_area
|
|
|
- * structures allocated in the __get_vm_area_node() function contain
|
|
|
- * references to the virtual address of the vmalloc'ed block.
|
|
|
+ * A ref_count = 2 is needed because vm_struct allocated in
|
|
|
+ * __get_vm_area_node() contains a reference to the virtual address of
|
|
|
+ * the vmalloc'ed block.
|
|
|
*/
|
|
|
- kmemleak_alloc(addr, real_size, 3, gfp_mask);
|
|
|
+ kmemleak_alloc(addr, real_size, 2, gfp_mask);
|
|
|
|
|
|
return addr;
|
|
|
|