forked from Minki/linux
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 *)
|
#define BYTES_PER_POINTER sizeof(void *)
|
||||||
|
|
||||||
/* GFP bitmask for kmemleak internal allocations */
|
/* 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 */
|
/* scanning area inside a memory block */
|
||||||
struct kmemleak_scan_area {
|
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 kmemleak_object *object;
|
||||||
struct prio_tree_node *node;
|
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) {
|
if (!object) {
|
||||||
kmemleak_stop("Cannot allocate a kmemleak_object structure\n");
|
pr_warning("Cannot allocate a kmemleak_object structure\n");
|
||||||
|
kmemleak_disable();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -734,9 +737,9 @@ static void add_scan_area(unsigned long ptr, size_t size, gfp_t gfp)
|
|||||||
return;
|
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) {
|
if (!area) {
|
||||||
kmemleak_warn("Cannot allocate a scan area\n");
|
pr_warning("Cannot allocate a scan area\n");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user