aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuis R. Rodriguez <lrodriguez@Atheros.com>2009-09-04 20:44:51 -0400
committerCatalin Marinas <catalin.marinas@arm.com>2009-09-08 11:36:08 -0400
commit30b3710105be0ba6bbdb7d7d126af76246b02eba (patch)
tree84200b02f8230f3706744512bf4ba68341d9b889
parent4a558dd6f93d419cd318958577e25492bd09e960 (diff)
kmemleak: add clear command support
In an ideal world your kmemleak output will be small, when its not (usually during initial bootup) you can use the clear command to ingore previously reported and unreferenced kmemleak objects. We do this by painting all currently reported unreferenced objects grey. We paint them grey instead of black to allow future scans on the same objects as such objects could still potentially reference newly allocated objects in the future. To test a critical section on demand with a clean /sys/kernel/debug/kmemleak you can do: echo clear > /sys/kernel/debug/kmemleak test your kernel or modules echo scan > /sys/kernel/debug/kmemleak Then as usual to get your report with: cat /sys/kernel/debug/kmemleak Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com> Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
-rw-r--r--Documentation/kmemleak.txt30
-rw-r--r--mm/kmemleak.c26
2 files changed, 56 insertions, 0 deletions
diff --git a/Documentation/kmemleak.txt b/Documentation/kmemleak.txt
index c223785339b5..34f6638aa5ac 100644
--- a/Documentation/kmemleak.txt
+++ b/Documentation/kmemleak.txt
@@ -27,6 +27,13 @@ To trigger an intermediate memory scan:
27 27
28 # echo scan > /sys/kernel/debug/kmemleak 28 # echo scan > /sys/kernel/debug/kmemleak
29 29
30To clear the list of all current possible memory leaks:
31
32 # echo clear > /sys/kernel/debug/kmemleak
33
34New leaks will then come up upon reading /sys/kernel/debug/kmemleak
35again.
36
30Note that the orphan objects are listed in the order they were allocated 37Note that the orphan objects are listed in the order they were allocated
31and one object at the beginning of the list may cause other subsequent 38and one object at the beginning of the list may cause other subsequent
32objects to be reported as orphan. 39objects to be reported as orphan.
@@ -42,6 +49,8 @@ Memory scanning parameters can be modified at run-time by writing to the
42 scan=<secs> - set the automatic memory scanning period in seconds 49 scan=<secs> - set the automatic memory scanning period in seconds
43 (default 600, 0 to stop the automatic scanning) 50 (default 600, 0 to stop the automatic scanning)
44 scan - trigger a memory scan 51 scan - trigger a memory scan
52 clear - clear list of current memory leak suspects, done by
53 marking all current reported unreferenced objects grey
45 dump=<addr> - dump information about the object found at <addr> 54 dump=<addr> - dump information about the object found at <addr>
46 55
47Kmemleak can also be disabled at boot-time by passing "kmemleak=off" on 56Kmemleak can also be disabled at boot-time by passing "kmemleak=off" on
@@ -87,6 +96,27 @@ avoid this, kmemleak can also store the number of values pointing to an
87address inside the block address range that need to be found so that the 96address inside the block address range that need to be found so that the
88block is not considered a leak. One example is __vmalloc(). 97block is not considered a leak. One example is __vmalloc().
89 98
99Testing specific sections with kmemleak
100---------------------------------------
101
102Upon initial bootup your /sys/kernel/debug/kmemleak output page may be
103quite extensive. This can also be the case if you have very buggy code
104when doing development. To work around these situations you can use the
105'clear' command to clear all reported unreferenced objects from the
106/sys/kernel/debug/kmemleak output. By issuing a 'scan' after a 'clear'
107you can find new unreferenced objects; this should help with testing
108specific sections of code.
109
110To test a critical section on demand with a clean kmemleak do:
111
112 # echo clear > /sys/kernel/debug/kmemleak
113 ... test your kernel or modules ...
114 # echo scan > /sys/kernel/debug/kmemleak
115
116Then as usual to get your report with:
117
118 # cat /sys/kernel/debug/kmemleak
119
90Kmemleak API 120Kmemleak API
91------------ 121------------
92 122
diff --git a/mm/kmemleak.c b/mm/kmemleak.c
index f5042b4a7b95..c17dbc76fb72 100644
--- a/mm/kmemleak.c
+++ b/mm/kmemleak.c
@@ -1421,6 +1421,28 @@ static int dump_str_object_info(const char *str)
1421} 1421}
1422 1422
1423/* 1423/*
1424 * We use grey instead of black to ensure we can do future scans on the same
1425 * objects. If we did not do future scans these black objects could
1426 * potentially contain references to newly allocated objects in the future and
1427 * we'd end up with false positives.
1428 */
1429static void kmemleak_clear(void)
1430{
1431 struct kmemleak_object *object;
1432 unsigned long flags;
1433
1434 rcu_read_lock();
1435 list_for_each_entry_rcu(object, &object_list, object_list) {
1436 spin_lock_irqsave(&object->lock, flags);
1437 if ((object->flags & OBJECT_REPORTED) &&
1438 unreferenced_object(object))
1439 object->min_count = 0;
1440 spin_unlock_irqrestore(&object->lock, flags);
1441 }
1442 rcu_read_unlock();
1443}
1444
1445/*
1424 * File write operation to configure kmemleak at run-time. The following 1446 * File write operation to configure kmemleak at run-time. The following
1425 * commands can be written to the /sys/kernel/debug/kmemleak file: 1447 * commands can be written to the /sys/kernel/debug/kmemleak file:
1426 * off - disable kmemleak (irreversible) 1448 * off - disable kmemleak (irreversible)
@@ -1431,6 +1453,8 @@ static int dump_str_object_info(const char *str)
1431 * scan=... - set the automatic memory scanning period in seconds (0 to 1453 * scan=... - set the automatic memory scanning period in seconds (0 to
1432 * disable it) 1454 * disable it)
1433 * scan - trigger a memory scan 1455 * scan - trigger a memory scan
1456 * clear - mark all current reported unreferenced kmemleak objects as
1457 * grey to ignore printing them
1434 * dump=... - dump information about the object found at the given address 1458 * dump=... - dump information about the object found at the given address
1435 */ 1459 */
1436static ssize_t kmemleak_write(struct file *file, const char __user *user_buf, 1460static ssize_t kmemleak_write(struct file *file, const char __user *user_buf,
@@ -1472,6 +1496,8 @@ static ssize_t kmemleak_write(struct file *file, const char __user *user_buf,
1472 } 1496 }
1473 } else if (strncmp(buf, "scan", 4) == 0) 1497 } else if (strncmp(buf, "scan", 4) == 0)
1474 kmemleak_scan(); 1498 kmemleak_scan();
1499 else if (strncmp(buf, "clear", 5) == 0)
1500 kmemleak_clear();
1475 else if (strncmp(buf, "dump=", 5) == 0) 1501 else if (strncmp(buf, "dump=", 5) == 0)
1476 ret = dump_str_object_info(buf + 5); 1502 ret = dump_str_object_info(buf + 5);
1477 else 1503 else