kmemleak: Allow kmemleak metadata allocations to fail
This patch adds __GFP_NORETRY and __GFP_NOMEMALLOC flags to the kmemleak metadata allocations so that it has a smaller effect on the users of the kernel slab allocator. Since kmemleak allocations can now fail more often, this patch also reduces the verbosity by passing __GFP_NOWARN and not dumping the stack trace when a kmemleak allocation fails. Signed-off-by: Catalin Marinas <catalin.marinas@arm.com> Reported-by: Toralf Förster <toralf.foerster@gmx.de> Acked-by: Pekka Enberg <penberg@cs.helsinki.fi> Acked-by: David Rientjes <rientjes@google.com> Cc: Ted Ts'o <tytso@mit.edu>
This commit is contained in:
parent
0a08739e81
commit
6ae4bd1f0b
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue