Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -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.
+25 −0
Original line number Original line Diff line number Diff line
@@ -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)
	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)
 *   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,
		}
		}
	} 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;