aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
Diffstat (limited to 'mm')
-rw-r--r--mm/kmemleak.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/mm/kmemleak.c b/mm/kmemleak.c
index 8b528e3f8413..e8c905b70aa8 100644
--- a/mm/kmemleak.c
+++ b/mm/kmemleak.c
@@ -797,9 +797,13 @@ static void __init log_early(int op_type, const void *ptr, size_t size,
797 unsigned long flags; 797 unsigned long flags;
798 struct early_log *log; 798 struct early_log *log;
799 799
800 if (atomic_read(&kmemleak_error)) {
801 /* kmemleak stopped recording, just count the requests */
802 crt_early_log++;
803 return;
804 }
805
800 if (crt_early_log >= ARRAY_SIZE(early_log)) { 806 if (crt_early_log >= ARRAY_SIZE(early_log)) {
801 pr_warning("Early log buffer exceeded, "
802 "please increase DEBUG_KMEMLEAK_EARLY_LOG_SIZE\n");
803 kmemleak_disable(); 807 kmemleak_disable();
804 return; 808 return;
805 } 809 }
@@ -1634,7 +1638,6 @@ static void kmemleak_disable(void)
1634 return; 1638 return;
1635 1639
1636 /* stop any memory operation tracing */ 1640 /* stop any memory operation tracing */
1637 atomic_set(&kmemleak_early_log, 0);
1638 atomic_set(&kmemleak_enabled, 0); 1641 atomic_set(&kmemleak_enabled, 0);
1639 1642
1640 /* check whether it is too early for a kernel thread */ 1643 /* check whether it is too early for a kernel thread */
@@ -1694,12 +1697,18 @@ void __init kmemleak_init(void)
1694 scan_area_cache = KMEM_CACHE(kmemleak_scan_area, SLAB_NOLEAKTRACE); 1697 scan_area_cache = KMEM_CACHE(kmemleak_scan_area, SLAB_NOLEAKTRACE);
1695 INIT_PRIO_TREE_ROOT(&object_tree_root); 1698 INIT_PRIO_TREE_ROOT(&object_tree_root);
1696 1699
1700 if (crt_early_log >= ARRAY_SIZE(early_log))
1701 pr_warning("Early log buffer exceeded (%d), please increase "
1702 "DEBUG_KMEMLEAK_EARLY_LOG_SIZE\n", crt_early_log);
1703
1697 /* the kernel is still in UP mode, so disabling the IRQs is enough */ 1704 /* the kernel is still in UP mode, so disabling the IRQs is enough */
1698 local_irq_save(flags); 1705 local_irq_save(flags);
1699 if (!atomic_read(&kmemleak_error)) { 1706 atomic_set(&kmemleak_early_log, 0);
1707 if (atomic_read(&kmemleak_error)) {
1708 local_irq_restore(flags);
1709 return;
1710 } else
1700 atomic_set(&kmemleak_enabled, 1); 1711 atomic_set(&kmemleak_enabled, 1);
1701 atomic_set(&kmemleak_early_log, 0);
1702 }
1703 local_irq_restore(flags); 1712 local_irq_restore(flags);
1704 1713
1705 /* 1714 /*