Commit 189d84ed authored by Catalin Marinas's avatar Catalin Marinas

kmemleak: Dump object information on request

By writing dump=<addr> to the kmemleak file, kmemleak will look up an
object with that address and dump the information it has about it to
syslog. This is useful in debugging memory leaks.
Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
parent af98603d
...@@ -42,6 +42,7 @@ Memory scanning parameters can be modified at run-time by writing to the ...@@ -42,6 +42,7 @@ Memory scanning parameters can be modified at run-time by writing to the
scan=<secs> - set the automatic memory scanning period in seconds scan=<secs> - set the automatic memory scanning period in seconds
(default 600, 0 to stop the automatic scanning) (default 600, 0 to stop the automatic scanning)
scan - trigger a memory scan scan - trigger a memory scan
dump=<addr> - dump information about the object found at <addr>
Kmemleak can also be disabled at boot-time by passing "kmemleak=off" on Kmemleak can also be disabled at boot-time by passing "kmemleak=off" on
the kernel command line. the kernel command line.
......
...@@ -331,6 +331,7 @@ static void dump_object_info(struct kmemleak_object *object) ...@@ -331,6 +331,7 @@ static void dump_object_info(struct kmemleak_object *object)
object->comm, object->pid, object->jiffies); object->comm, object->pid, object->jiffies);
pr_notice(" min_count = %d\n", object->min_count); pr_notice(" min_count = %d\n", object->min_count);
pr_notice(" count = %d\n", object->count); pr_notice(" count = %d\n", object->count);
pr_notice(" flags = 0x%lx\n", object->flags);
pr_notice(" backtrace:\n"); pr_notice(" backtrace:\n");
print_stack_trace(&trace, 4); print_stack_trace(&trace, 4);
} }
...@@ -1307,6 +1308,27 @@ static int kmemleak_release(struct inode *inode, struct file *file) ...@@ -1307,6 +1308,27 @@ static int kmemleak_release(struct inode *inode, struct file *file)
return seq_release(inode, file); return seq_release(inode, file);
} }
static int dump_str_object_info(const char *str)
{
unsigned long flags;
struct kmemleak_object *object;
unsigned long addr;
addr= simple_strtoul(str, NULL, 0);
object = find_and_get_object(addr, 0);
if (!object) {
pr_info("Unknown object at 0x%08lx\n", addr);
return -EINVAL;
}
spin_lock_irqsave(&object->lock, flags);
dump_object_info(object);
spin_unlock_irqrestore(&object->lock, flags);
put_object(object);
return 0;
}
/* /*
* File write operation to configure kmemleak at run-time. The following * File write operation to configure kmemleak at run-time. The following
* commands can be written to the /sys/kernel/debug/kmemleak file: * commands can be written to the /sys/kernel/debug/kmemleak file:
...@@ -1318,6 +1340,7 @@ static int kmemleak_release(struct inode *inode, struct file *file) ...@@ -1318,6 +1340,7 @@ static int kmemleak_release(struct inode *inode, struct file *file)
* scan=... - set the automatic memory scanning period in seconds (0 to * scan=... - set the automatic memory scanning period in seconds (0 to
* disable it) * disable it)
* scan - trigger a memory scan * scan - trigger a memory scan
* dump=... - dump information about the object found at the given address
*/ */
static ssize_t kmemleak_write(struct file *file, const char __user *user_buf, static ssize_t kmemleak_write(struct file *file, const char __user *user_buf,
size_t size, loff_t *ppos) size_t size, loff_t *ppos)
...@@ -1358,6 +1381,8 @@ static ssize_t kmemleak_write(struct file *file, const char __user *user_buf, ...@@ -1358,6 +1381,8 @@ static ssize_t kmemleak_write(struct file *file, const char __user *user_buf,
} }
} else if (strncmp(buf, "scan", 4) == 0) } else if (strncmp(buf, "scan", 4) == 0)
kmemleak_scan(); kmemleak_scan();
else if (strncmp(buf, "dump=", 5) == 0)
ret = dump_str_object_info(buf + 5);
else else
ret = -EINVAL; ret = -EINVAL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment