#define BYTES_PER_POINTER sizeof(void *)
+/* GFP bitmask for kmemleak internal allocations */
+#define GFP_KMEMLEAK_MASK (GFP_KERNEL | GFP_ATOMIC)
+
/* scanning area inside a memory block */
struct kmemleak_scan_area {
struct hlist_node node;
static int reported_leaks;
/*
- * Early object allocation/freeing logging. Kkmemleak is initialized after the
+ * Early object allocation/freeing logging. Kmemleak is initialized after the
* kernel allocator. However, both the kernel allocator and kmemleak may
- * allocate memory blocks which need to be tracked. Kkmemleak defines an
+ * allocate memory blocks which need to be tracked. Kmemleak defines an
* arbitrary buffer to hold the allocation/freeing information before it is
* fully initialized.
*/
/*
* Macro invoked when a serious kmemleak condition occured and cannot be
- * recovered from. Kkmemleak will be disabled and further allocation/freeing
+ * recovered from. Kmemleak will be disabled and further allocation/freeing
* tracing no longer available.
*/
-#define kmemleak_panic(x...) do { \
+#define kmemleak_stop(x...) do { \
kmemleak_warn(x); \
kmemleak_disable(); \
} while (0)
struct prio_tree_node *node;
struct stack_trace trace;
- object = kmem_cache_alloc(object_cache, gfp & ~GFP_SLAB_BUG_MASK);
+ object = kmem_cache_alloc(object_cache, gfp & GFP_KMEMLEAK_MASK);
if (!object) {
- kmemleak_panic("kmemleak: Cannot allocate a kmemleak_object "
- "structure\n");
+ kmemleak_stop("kmemleak: Cannot allocate a kmemleak_object "
+ "structure\n");
return;
}
if (node != &object->tree_node) {
unsigned long flags;
- kmemleak_panic("kmemleak: Cannot insert 0x%lx into the object "
- "search tree (already existing)\n", ptr);
+ kmemleak_stop("kmemleak: Cannot insert 0x%lx into the object "
+ "search tree (already existing)\n", ptr);
object = lookup_object(ptr, 1);
spin_lock_irqsave(&object->lock, flags);
dump_object_info(object);
return;
}
- area = kmem_cache_alloc(scan_area_cache, gfp & ~GFP_SLAB_BUG_MASK);
+ area = kmem_cache_alloc(scan_area_cache, gfp & GFP_KMEMLEAK_MASK);
if (!area) {
kmemleak_warn("kmemleak: Cannot allocate a scan area\n");
goto out;
struct early_log *log;
if (crt_early_log >= ARRAY_SIZE(early_log)) {
- kmemleak_panic("kmemleak: Early log buffer exceeded\n");
+ kmemleak_stop("kmemleak: Early log buffer exceeded\n");
return;
}
early_param("kmemleak", kmemleak_boot_config);
/*
- * Kkmemleak initialization.
+ * Kmemleak initialization.
*/
void __init kmemleak_init(void)
{