aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
Diffstat (limited to 'mm')
-rw-r--r--mm/kmemleak.c31
1 files changed, 1 insertions, 30 deletions
diff --git a/mm/kmemleak.c b/mm/kmemleak.c
index eeece2deace2..e766e1da09d2 100644
--- a/mm/kmemleak.c
+++ b/mm/kmemleak.c
@@ -105,7 +105,6 @@
105#define MAX_TRACE 16 /* stack trace length */ 105#define MAX_TRACE 16 /* stack trace length */
106#define REPORTS_NR 50 /* maximum number of reported leaks */ 106#define REPORTS_NR 50 /* maximum number of reported leaks */
107#define MSECS_MIN_AGE 5000 /* minimum object age for reporting */ 107#define MSECS_MIN_AGE 5000 /* minimum object age for reporting */
108#define MSECS_SCAN_YIELD 10 /* CPU yielding period */
109#define SECS_FIRST_SCAN 60 /* delay before the first scan */ 108#define SECS_FIRST_SCAN 60 /* delay before the first scan */
110#define SECS_SCAN_WAIT 600 /* subsequent auto scanning delay */ 109#define SECS_SCAN_WAIT 600 /* subsequent auto scanning delay */
111 110
@@ -186,10 +185,7 @@ static atomic_t kmemleak_error = ATOMIC_INIT(0);
186static unsigned long min_addr = ULONG_MAX; 185static unsigned long min_addr = ULONG_MAX;
187static unsigned long max_addr; 186static unsigned long max_addr;
188 187
189/* used for yielding the CPU to other tasks during scanning */
190static unsigned long next_scan_yield;
191static struct task_struct *scan_thread; 188static struct task_struct *scan_thread;
192static unsigned long jiffies_scan_yield;
193/* used to avoid reporting of recently allocated objects */ 189/* used to avoid reporting of recently allocated objects */
194static unsigned long jiffies_min_age; 190static unsigned long jiffies_min_age;
195static unsigned long jiffies_last_scan; 191static unsigned long jiffies_last_scan;
@@ -786,21 +782,6 @@ void kmemleak_no_scan(const void *ptr)
786EXPORT_SYMBOL(kmemleak_no_scan); 782EXPORT_SYMBOL(kmemleak_no_scan);
787 783
788/* 784/*
789 * Yield the CPU so that other tasks get a chance to run. The yielding is
790 * rate-limited to avoid excessive number of calls to the schedule() function
791 * during memory scanning.
792 */
793static void scan_yield(void)
794{
795 might_sleep();
796
797 if (time_is_before_eq_jiffies(next_scan_yield)) {
798 schedule();
799 next_scan_yield = jiffies + jiffies_scan_yield;
800 }
801}
802
803/*
804 * Memory scanning is a long process and it needs to be interruptable. This 785 * Memory scanning is a long process and it needs to be interruptable. This
805 * function checks whether such interrupt condition occured. 786 * function checks whether such interrupt condition occured.
806 */ 787 */
@@ -840,15 +821,6 @@ static void scan_block(void *_start, void *_end,
840 if (scan_should_stop()) 821 if (scan_should_stop())
841 break; 822 break;
842 823
843 /*
844 * When scanning a memory block with a corresponding
845 * kmemleak_object, the CPU yielding is handled in the calling
846 * code since it holds the object->lock to avoid the block
847 * freeing.
848 */
849 if (!scanned)
850 scan_yield();
851
852 object = find_and_get_object(pointer, 1); 824 object = find_and_get_object(pointer, 1);
853 if (!object) 825 if (!object)
854 continue; 826 continue;
@@ -1014,7 +986,7 @@ static void kmemleak_scan(void)
1014 */ 986 */
1015 object = list_entry(gray_list.next, typeof(*object), gray_list); 987 object = list_entry(gray_list.next, typeof(*object), gray_list);
1016 while (&object->gray_list != &gray_list) { 988 while (&object->gray_list != &gray_list) {
1017 scan_yield(); 989 cond_resched();
1018 990
1019 /* may add new objects to the list */ 991 /* may add new objects to the list */
1020 if (!scan_should_stop()) 992 if (!scan_should_stop())
@@ -1385,7 +1357,6 @@ void __init kmemleak_init(void)
1385 int i; 1357 int i;
1386 unsigned long flags; 1358 unsigned long flags;
1387 1359
1388 jiffies_scan_yield = msecs_to_jiffies(MSECS_SCAN_YIELD);
1389 jiffies_min_age = msecs_to_jiffies(MSECS_MIN_AGE); 1360 jiffies_min_age = msecs_to_jiffies(MSECS_MIN_AGE);
1390 jiffies_scan_wait = msecs_to_jiffies(SECS_SCAN_WAIT * 1000); 1361 jiffies_scan_wait = msecs_to_jiffies(SECS_SCAN_WAIT * 1000);
1391 1362