All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tony Lindgren <tony@atomide.com>
To: Hiroshi DOYU <Hiroshi.DOYU@nokia.com>
Cc: linux@arm.linux.org.uk, linux-arm-kernel@lists.arm.linux.org.uk,
	linux-omap@vger.kernel.org
Subject: Re: [PATCH 02/10] OMAP: iommu: add initial debugfs support
Date: Sun, 16 Aug 2009 18:13:55 +0300	[thread overview]
Message-ID: <20090816151347.GZ7278@atomide.com> (raw)
In-Reply-To: <20090815.150603.104063905.Hiroshi.DOYU@nokia.com>

* Hiroshi DOYU <Hiroshi.DOYU@nokia.com> [090815 15:06]:
> Hi Russell,
> 
> From: ext Russell King - ARM Linux <linux@arm.linux.org.uk>
> Subject: Re: [PATCH 02/10] OMAP: iommu: add initial debugfs support
> Date: Thu, 13 Aug 2009 11:23:59 +0200
> 
> > On Wed, Aug 12, 2009 at 03:13:24PM +0300, Tony Lindgren wrote:
> > > +static DEFINE_MUTEX(iommu_debug_lock);
> > > +static char local_buffer[SZ_4K];
> > 
> > I don't like this - what if the data you're sprintf'ing into this
> > buffer overflows it?
> 
> Right.
> 
> I have attached the updated version which limits max write counts to
> avoid the above buffer overflow.

Thanks, I've update my queue with it.

Tony


> From ac6962fe970c7d6259a17e36a578eac8a800452a Mon Sep 17 00:00:00 2001
> From: Hiroshi DOYU <Hiroshi.DOYU@nokia.com>
> Date: Wed, 12 Aug 2009 15:06:33 +0300
> Subject: [PATCH 1/1] OMAP: iommu: add initial debugfs support
> 
> This enables to peek the following data.
> 
> $ /debug/iommu/isp# ls
> mem             nr_tlb_entries  regs
> mmap            pagetable       tlb
> $ /debug/iommu/isp# head pagetable
> L:      da:      pa:
> -----------------------------------------
> 2: 00001000 8ae4a002
> 2: 00002000 8e7bb002
> 2: 00003000 8ae49002
> 2: 00004000 8ae65002
> .....
> 
> Signed-off-by: Hiroshi DOYU <Hiroshi.DOYU@nokia.com>
> Signed-off-by: Tony Lindgren <tony@atomide.com>
> ---
>  arch/arm/mach-omap2/iommu2.c            |   18 +-
>  arch/arm/plat-omap/Kconfig              |    4 +
>  arch/arm/plat-omap/Makefile             |    1 +
>  arch/arm/plat-omap/include/mach/iommu.h |    6 +-
>  arch/arm/plat-omap/iommu-debug.c        |  413 +++++++++++++++++++++++++++++++
>  arch/arm/plat-omap/iommu.c              |   23 +-
>  6 files changed, 446 insertions(+), 19 deletions(-)
>  create mode 100644 arch/arm/plat-omap/iommu-debug.c
> 
> diff --git a/arch/arm/mach-omap2/iommu2.c b/arch/arm/mach-omap2/iommu2.c
> index 015f22a..00f0ab3 100644
> --- a/arch/arm/mach-omap2/iommu2.c
> +++ b/arch/arm/mach-omap2/iommu2.c
> @@ -217,10 +217,18 @@ static ssize_t omap2_dump_cr(struct iommu *obj, struct cr_regs *cr, char *buf)
>  }
>  
>  #define pr_reg(name)							\
> -	p += sprintf(p, "%20s: %08x\n",					\
> -		     __stringify(name), iommu_read_reg(obj, MMU_##name));
> -
> -static ssize_t omap2_iommu_dump_ctx(struct iommu *obj, char *buf)
> +	do {								\
> +		ssize_t bytes;						\
> +		const char *str = "%20s: %08x\n";			\
> +		bytes = snprintf(p, 32, str, __stringify(name),		\
> +				 iommu_read_reg(obj, MMU_##name));	\
> +		p += bytes;						\
> +		len -= bytes;						\
> +		if (len < strlen(str) + 1)				\
> +			goto out;					\
> +	} while (0)
> +
> +static ssize_t omap2_iommu_dump_ctx(struct iommu *obj, char *buf, ssize_t len)
>  {
>  	char *p = buf;
>  
> @@ -242,7 +250,7 @@ static ssize_t omap2_iommu_dump_ctx(struct iommu *obj, char *buf)
>  	pr_reg(READ_CAM);
>  	pr_reg(READ_RAM);
>  	pr_reg(EMU_FAULT_AD);
> -
> +out:
>  	return p - buf;
>  }
>  
> diff --git a/arch/arm/plat-omap/Kconfig b/arch/arm/plat-omap/Kconfig
> index efe85d0..ab9f9ef 100644
> --- a/arch/arm/plat-omap/Kconfig
> +++ b/arch/arm/plat-omap/Kconfig
> @@ -120,6 +120,10 @@ config OMAP_MBOX_FWK
>  config OMAP_IOMMU
>  	tristate
>  
> +config OMAP_IOMMU_DEBUG
> +	depends on OMAP_IOMMU
> +	tristate
> +
>  choice
>          prompt "System timer"
>  	default OMAP_MPU_TIMER
> diff --git a/arch/arm/plat-omap/Makefile b/arch/arm/plat-omap/Makefile
> index a832795..769a4c2 100644
> --- a/arch/arm/plat-omap/Makefile
> +++ b/arch/arm/plat-omap/Makefile
> @@ -14,6 +14,7 @@ obj-$(CONFIG_ARCH_OMAP16XX) += ocpi.o
>  
>  obj-$(CONFIG_OMAP_MCBSP) += mcbsp.o
>  obj-$(CONFIG_OMAP_IOMMU) += iommu.o iovmm.o
> +obj-$(CONFIG_OMAP_IOMMU_DEBUG) += iommu-debug.o
>  
>  obj-$(CONFIG_CPU_FREQ) += cpu-omap.o
>  obj-$(CONFIG_OMAP_DM_TIMER) += dmtimer.o
> diff --git a/arch/arm/plat-omap/include/mach/iommu.h b/arch/arm/plat-omap/include/mach/iommu.h
> index 769b00b..46d41ac 100644
> --- a/arch/arm/plat-omap/include/mach/iommu.h
> +++ b/arch/arm/plat-omap/include/mach/iommu.h
> @@ -95,7 +95,7 @@ struct iommu_functions {
>  
>  	void (*save_ctx)(struct iommu *obj);
>  	void (*restore_ctx)(struct iommu *obj);
> -	ssize_t (*dump_ctx)(struct iommu *obj, char *buf);
> +	ssize_t (*dump_ctx)(struct iommu *obj, char *buf, ssize_t len);
>  };
>  
>  struct iommu_platform_data {
> @@ -162,7 +162,7 @@ extern void uninstall_iommu_arch(const struct iommu_functions *ops);
>  extern int foreach_iommu_device(void *data,
>  				int (*fn)(struct device *, void *));
>  
> -extern ssize_t iommu_dump_ctx(struct iommu *obj, char *buf);
> -extern size_t dump_tlb_entries(struct iommu *obj, char *buf);
> +extern ssize_t iommu_dump_ctx(struct iommu *obj, char *buf, ssize_t len);
> +extern size_t dump_tlb_entries(struct iommu *obj, char *buf, ssize_t len);
>  
>  #endif /* __MACH_IOMMU_H */
> diff --git a/arch/arm/plat-omap/iommu-debug.c b/arch/arm/plat-omap/iommu-debug.c
> new file mode 100644
> index 0000000..536e897
> --- /dev/null
> +++ b/arch/arm/plat-omap/iommu-debug.c
> @@ -0,0 +1,413 @@
> +/*
> + * omap iommu: debugfs interface
> + *
> + * Copyright (C) 2008-2009 Nokia Corporation
> + *
> + * Written by Hiroshi DOYU <Hiroshi.DOYU@nokia.com>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + */
> +
> +#include <linux/err.h>
> +#include <linux/clk.h>
> +#include <linux/io.h>
> +#include <linux/uaccess.h>
> +#include <linux/platform_device.h>
> +#include <linux/debugfs.h>
> +
> +#include <mach/iommu.h>
> +#include <mach/iovmm.h>
> +
> +#include "iopgtable.h"
> +
> +#define MAXCOLUMN 100 /* for short messages */
> +
> +static DEFINE_MUTEX(iommu_debug_lock);
> +
> +static struct dentry *iommu_debug_root;
> +
> +static ssize_t debug_read_ver(struct file *file, char __user *userbuf,
> +			      size_t count, loff_t *ppos)
> +{
> +	u32 ver = iommu_arch_version();
> +	char buf[MAXCOLUMN], *p = buf;
> +
> +	p += sprintf(p, "H/W version: %d.%d\n", (ver >> 4) & 0xf , ver & 0xf);
> +
> +	return simple_read_from_buffer(userbuf, count, ppos, buf, p - buf);
> +}
> +
> +static ssize_t debug_read_regs(struct file *file, char __user *userbuf,
> +			       size_t count, loff_t *ppos)
> +{
> +	struct iommu *obj = file->private_data;
> +	char *p, *buf;
> +	ssize_t bytes;
> +
> +	buf = kmalloc(count, GFP_KERNEL);
> +	if (!buf)
> +		return -ENOMEM;
> +	p = buf;
> +
> +	mutex_lock(&iommu_debug_lock);
> +
> +	bytes = iommu_dump_ctx(obj, p, count);
> +	bytes = simple_read_from_buffer(userbuf, count, ppos, buf, bytes);
> +
> +	mutex_unlock(&iommu_debug_lock);
> +	kfree(buf);
> +
> +	return bytes;
> +}
> +
> +static ssize_t debug_read_tlb(struct file *file, char __user *userbuf,
> +			      size_t count, loff_t *ppos)
> +{
> +	struct iommu *obj = file->private_data;
> +	char *p, *buf;
> +	ssize_t bytes, rest;
> +
> +	buf = kmalloc(count, GFP_KERNEL);
> +	if (!buf)
> +		return -ENOMEM;
> +	p = buf;
> +
> +	mutex_lock(&iommu_debug_lock);
> +
> +	p += sprintf(p, "%8s %8s\n", "cam:", "ram:");
> +	p += sprintf(p, "-----------------------------------------\n");
> +	rest = count - (p - buf);
> +	p += dump_tlb_entries(obj, p, rest);
> +
> +	bytes = simple_read_from_buffer(userbuf, count, ppos, buf, p - buf);
> +
> +	mutex_unlock(&iommu_debug_lock);
> +	kfree(buf);
> +
> +	return bytes;
> +}
> +
> +static ssize_t debug_write_pagetable(struct file *file,
> +		     const char __user *userbuf, size_t count, loff_t *ppos)
> +{
> +	struct iotlb_entry e;
> +	struct cr_regs cr;
> +	int err;
> +	struct iommu *obj = file->private_data;
> +	char buf[MAXCOLUMN], *p = buf;
> +
> +	count = min(count, sizeof(buf));
> +
> +	mutex_lock(&iommu_debug_lock);
> +	if (copy_from_user(p, userbuf, count)) {
> +		mutex_unlock(&iommu_debug_lock);
> +		return -EFAULT;
> +	}
> +
> +	sscanf(p, "%x %x", &cr.cam, &cr.ram);
> +	if (!cr.cam || !cr.ram) {
> +		mutex_unlock(&iommu_debug_lock);
> +		return -EINVAL;
> +	}
> +
> +	iotlb_cr_to_e(&cr, &e);
> +	err = iopgtable_store_entry(obj, &e);
> +	if (err)
> +		dev_err(obj->dev, "%s: fail to store cr\n", __func__);
> +
> +	mutex_unlock(&iommu_debug_lock);
> +	return count;
> +}
> +
> +#define dump_ioptable_entry_one(lv, da, pteval)			\
> +	({							\
> +		int __err = 0;					\
> +		ssize_t bytes;					\
> +		const char *str = "%d: %08x %08x\n";		\
> +		bytes = snprintf(p, 22, str, lv, da, pteval);	\
> +		p += bytes;					\
> +		len -= bytes;					\
> +		if (len < strlen(str) + 1)			\
> +			__err = -ENOMEM;			\
> +		__err;						\
> +	})
> +
> +static ssize_t dump_ioptable(struct iommu *obj, char *buf, ssize_t len)
> +{
> +	int i;
> +	u32 *iopgd;
> +	char *p = buf;
> +
> +	spin_lock(&obj->page_table_lock);
> +
> +	iopgd = iopgd_offset(obj, 0);
> +	for (i = 0; i < PTRS_PER_IOPGD; i++, iopgd++) {
> +		int j, err;
> +		u32 *iopte;
> +		u32 da;
> +
> +		if (!*iopgd)
> +			continue;
> +
> +		if (!(*iopgd & IOPGD_TABLE)) {
> +			da = i << IOPGD_SHIFT;
> +
> +			err = dump_ioptable_entry_one(1, da, *iopgd);
> +			if (err)
> +				goto out;
> +			continue;
> +		}
> +
> +		iopte = iopte_offset(iopgd, 0);
> +
> +		for (j = 0; j < PTRS_PER_IOPTE; j++, iopte++) {
> +			if (!*iopte)
> +				continue;
> +
> +			da = (i << IOPGD_SHIFT) + (j << IOPTE_SHIFT);
> +			err = dump_ioptable_entry_one(2, da, *iopgd);
> +			if (err)
> +				goto out;
> +		}
> +	}
> +out:
> +	spin_unlock(&obj->page_table_lock);
> +
> +	return p - buf;
> +}
> +
> +static ssize_t debug_read_pagetable(struct file *file, char __user *userbuf,
> +				    size_t count, loff_t *ppos)
> +{
> +	struct iommu *obj = file->private_data;
> +	char *p, *buf;
> +	size_t bytes;
> +
> +	buf = (char *)__get_free_page(GFP_KERNEL);
> +	if (!buf)
> +		return -ENOMEM;
> +	p = buf;
> +
> +	p += sprintf(p, "L: %8s %8s\n", "da:", "pa:");
> +	p += sprintf(p, "-----------------------------------------\n");
> +
> +	mutex_lock(&iommu_debug_lock);
> +
> +	bytes = PAGE_SIZE - (p - buf);
> +	p += dump_ioptable(obj, p, bytes);
> +
> +	bytes = simple_read_from_buffer(userbuf, count, ppos, buf, p - buf);
> +
> +	mutex_unlock(&iommu_debug_lock);
> +	free_page((unsigned long)buf);
> +
> +	return bytes;
> +}
> +
> +static ssize_t debug_read_mmap(struct file *file, char __user *userbuf,
> +			       size_t count, loff_t *ppos)
> +{
> +	struct iommu *obj = file->private_data;
> +	char *p, *buf;
> +	struct iovm_struct *tmp;
> +	int uninitialized_var(i);
> +	ssize_t bytes;
> +
> +	buf = (char *)__get_free_page(GFP_KERNEL);
> +	if (!buf)
> +		return -ENOMEM;
> +	p = buf;
> +
> +	p += sprintf(p, "%-3s %-8s %-8s %6s %8s\n",
> +		     "No", "start", "end", "size", "flags");
> +	p += sprintf(p, "-------------------------------------------------\n");
> +
> +	mutex_lock(&iommu_debug_lock);
> +
> +	list_for_each_entry(tmp, &obj->mmap, list) {
> +		size_t len;
> +		const char *str = "%3d %08x-%08x %6x %8x\n";
> +
> +		len = tmp->da_end - tmp->da_start;
> +		p += snprintf(p, strlen(str) + 1, str,
> +			      i, tmp->da_start, tmp->da_end, len, tmp->flags);
> +
> +		if ((strlen(str) + 1) > (PAGE_SIZE - (p - buf)))
> +			break;
> +		i++;
> +	}
> +
> +	bytes = simple_read_from_buffer(userbuf, count, ppos, buf, p - buf);
> +
> +	mutex_unlock(&iommu_debug_lock);
> +	free_page((unsigned long)buf);
> +
> +	return bytes;
> +}
> +
> +static ssize_t debug_read_mem(struct file *file, char __user *userbuf,
> +			      size_t count, loff_t *ppos)
> +{
> +	struct iommu *obj = file->private_data;
> +	char *p, *buf;
> +	struct iovm_struct *area;
> +	ssize_t bytes;
> +
> +	count = min_t(ssize_t, count, PAGE_SIZE);
> +
> +	buf = (char *)__get_free_page(GFP_KERNEL);
> +	if (!buf)
> +		return -ENOMEM;
> +	p = buf;
> +
> +	mutex_lock(&iommu_debug_lock);
> +
> +	area = find_iovm_area(obj, (u32)ppos);
> +	if (IS_ERR(area)) {
> +		mutex_unlock(&iommu_debug_lock);
> +		return -EINVAL;
> +	}
> +	memcpy(p, area->va, count);
> +	p += count;
> +
> +	bytes = simple_read_from_buffer(userbuf, count, ppos, buf, p - buf);
> +
> +	mutex_unlock(&iommu_debug_lock);
> +	free_page((unsigned long)buf);
> +
> +	return bytes;
> +}
> +
> +static ssize_t debug_write_mem(struct file *file, const char __user *userbuf,
> +			       size_t count, loff_t *ppos)
> +{
> +	struct iommu *obj = file->private_data;
> +	struct iovm_struct *area;
> +	char *p, *buf;
> +
> +	count = min_t(size_t, count, PAGE_SIZE);
> +
> +	buf = (char *)__get_free_page(GFP_KERNEL);
> +	if (!buf)
> +		return -ENOMEM;
> +	p = buf;
> +
> +	mutex_lock(&iommu_debug_lock);
> +
> +	if (copy_from_user(p, userbuf, count)) {
> +		mutex_unlock(&iommu_debug_lock);
> +		return -EFAULT;
> +	}
> +
> +	area = find_iovm_area(obj, (u32)ppos);
> +	if (IS_ERR(area)) {
> +		mutex_unlock(&iommu_debug_lock);
> +		return -EINVAL;
> +	}
> +	memcpy(area->va, p, count);
> +
> +	mutex_unlock(&iommu_debug_lock);
> +	free_page((unsigned long)buf);
> +
> +	return count;
> +}
> +
> +static int debug_open_generic(struct inode *inode, struct file *file)
> +{
> +	file->private_data = inode->i_private;
> +	return 0;
> +}
> +
> +#define DEBUG_FOPS(name)						\
> +	static const struct file_operations debug_##name##_fops = {	\
> +		.open = debug_open_generic,				\
> +		.read = debug_read_##name,				\
> +		.write = debug_write_##name,				\
> +	};
> +
> +#define DEBUG_FOPS_RO(name)						\
> +	static const struct file_operations debug_##name##_fops = {	\
> +		.open = debug_open_generic,				\
> +		.read = debug_read_##name,				\
> +	};
> +
> +DEBUG_FOPS_RO(ver);
> +DEBUG_FOPS_RO(regs);
> +DEBUG_FOPS_RO(tlb);
> +DEBUG_FOPS(pagetable);
> +DEBUG_FOPS_RO(mmap);
> +DEBUG_FOPS(mem);
> +
> +#define __DEBUG_ADD_FILE(attr, mode)					\
> +	{								\
> +		struct dentry *dent;					\
> +		dent = debugfs_create_file(#attr, mode, parent,		\
> +					   obj, &debug_##attr##_fops);	\
> +		if (!dent)						\
> +			return -ENOMEM;					\
> +	}
> +
> +#define DEBUG_ADD_FILE(name) __DEBUG_ADD_FILE(name, 600)
> +#define DEBUG_ADD_FILE_RO(name) __DEBUG_ADD_FILE(name, 400)
> +
> +static int iommu_debug_register(struct device *dev, void *data)
> +{
> +	struct platform_device *pdev = to_platform_device(dev);
> +	struct iommu *obj = platform_get_drvdata(pdev);
> +	struct dentry *d, *parent;
> +
> +	if (!obj || !obj->dev)
> +		return -EINVAL;
> +
> +	d = debugfs_create_dir(obj->name, iommu_debug_root);
> +	if (!d)
> +		return -ENOMEM;
> +	parent = d;
> +
> +	d = debugfs_create_u8("nr_tlb_entries", 400, parent,
> +			      (u8 *)&obj->nr_tlb_entries);
> +	if (!d)
> +		return -ENOMEM;
> +
> +	DEBUG_ADD_FILE_RO(ver);
> +	DEBUG_ADD_FILE_RO(regs);
> +	DEBUG_ADD_FILE_RO(tlb);
> +	DEBUG_ADD_FILE(pagetable);
> +	DEBUG_ADD_FILE_RO(mmap);
> +	DEBUG_ADD_FILE(mem);
> +
> +	return 0;
> +}
> +
> +static int __init iommu_debug_init(void)
> +{
> +	struct dentry *d;
> +	int err;
> +
> +	d = debugfs_create_dir("iommu", NULL);
> +	if (!d)
> +		return -ENOMEM;
> +	iommu_debug_root = d;
> +
> +	err = foreach_iommu_device(d, iommu_debug_register);
> +	if (err)
> +		goto err_out;
> +	return 0;
> +
> +err_out:
> +	debugfs_remove_recursive(iommu_debug_root);
> +	return err;
> +}
> +module_init(iommu_debug_init)
> +
> +static void __exit iommu_debugfs_exit(void)
> +{
> +	debugfs_remove_recursive(iommu_debug_root);
> +}
> +module_exit(iommu_debugfs_exit)
> +
> +MODULE_DESCRIPTION("omap iommu: debugfs interface");
> +MODULE_AUTHOR("Hiroshi DOYU <Hiroshi.DOYU@nokia.com>");
> +MODULE_LICENSE("GPL v2");
> diff --git a/arch/arm/plat-omap/iommu.c b/arch/arm/plat-omap/iommu.c
> index 4a03013..4b60127 100644
> --- a/arch/arm/plat-omap/iommu.c
> +++ b/arch/arm/plat-omap/iommu.c
> @@ -351,16 +351,14 @@ EXPORT_SYMBOL_GPL(flush_iotlb_all);
>  
>  #if defined(CONFIG_OMAP_IOMMU_DEBUG_MODULE)
>  
> -ssize_t iommu_dump_ctx(struct iommu *obj, char *buf)
> +ssize_t iommu_dump_ctx(struct iommu *obj, char *buf, ssize_t bytes)
>  {
> -	ssize_t bytes;
> -
>  	if (!obj || !buf)
>  		return -EINVAL;
>  
>  	clk_enable(obj->clk);
>  
> -	bytes = arch_iommu->dump_ctx(obj, buf);
> +	bytes = arch_iommu->dump_ctx(obj, buf, bytes);
>  
>  	clk_disable(obj->clk);
>  
> @@ -368,7 +366,7 @@ ssize_t iommu_dump_ctx(struct iommu *obj, char *buf)
>  }
>  EXPORT_SYMBOL_GPL(iommu_dump_ctx);
>  
> -static int __dump_tlb_entries(struct iommu *obj, struct cr_regs *crs)
> +static int __dump_tlb_entries(struct iommu *obj, struct cr_regs *crs, int num)
>  {
>  	int i;
>  	struct iotlb_lock saved, l;
> @@ -379,7 +377,7 @@ static int __dump_tlb_entries(struct iommu *obj, struct cr_regs *crs)
>  	iotlb_lock_get(obj, &saved);
>  	memcpy(&l, &saved, sizeof(saved));
>  
> -	for (i = 0; i < obj->nr_tlb_entries; i++) {
> +	for (i = 0; i < num; i++) {
>  		struct cr_regs tmp;
>  
>  		iotlb_lock_get(obj, &l);
> @@ -402,18 +400,21 @@ static int __dump_tlb_entries(struct iommu *obj, struct cr_regs *crs)
>   * @obj:	target iommu
>   * @buf:	output buffer
>   **/
> -size_t dump_tlb_entries(struct iommu *obj, char *buf)
> +size_t dump_tlb_entries(struct iommu *obj, char *buf, ssize_t bytes)
>  {
> -	int i, n;
> +	int i, num;
>  	struct cr_regs *cr;
>  	char *p = buf;
>  
> -	cr = kcalloc(obj->nr_tlb_entries, sizeof(*cr), GFP_KERNEL);
> +	num = bytes / sizeof(*cr);
> +	num = min(obj->nr_tlb_entries, num);
> +
> +	cr = kcalloc(num, sizeof(*cr), GFP_KERNEL);
>  	if (!cr)
>  		return 0;
>  
> -	n = __dump_tlb_entries(obj, cr);
> -	for (i = 0; i < n; i++)
> +	num = __dump_tlb_entries(obj, cr, num);
> +	for (i = 0; i < num; i++)
>  		p += iotlb_dump_cr(obj, cr + i, p);
>  	kfree(cr);
>  
> -- 
> 1.6.0.4
> 


  reply	other threads:[~2009-08-16 15:14 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-08-12 12:10 [PATCH 00/10] Omap3 updates for upcoming 2.6.32 merge window Tony Lindgren
2009-08-12 12:12 ` [PATCH 01/10] OMAP: iommu: fix wrong argument in flush_cache_vmap() Tony Lindgren
2009-08-13  9:21   ` Russell King - ARM Linux
2009-08-12 12:13 ` [PATCH 02/10] OMAP: iommu: add initial debugfs support Tony Lindgren
2009-08-13  9:23   ` Russell King - ARM Linux
2009-08-15 12:06     ` Hiroshi DOYU
2009-08-16 15:13       ` Tony Lindgren [this message]
2009-08-16 20:47         ` Russell King - ARM Linux
2009-08-17  4:19           ` Hiroshi DOYU
2009-08-17  7:28           ` Hiroshi DOYU
2009-08-27  7:25             ` Hiroshi DOYU
2009-08-28 18:24               ` Tony Lindgren
2009-08-12 12:14 ` [PATCH 03/10] OMAP2/3: Pass irqflags to 8250 driver Tony Lindgren
2009-08-12 12:16 ` [PATCH 04/10] OMAP3: 3430SDP: Fix defconfig Tony Lindgren
2009-08-13  9:24   ` Russell King - ARM Linux
2009-08-12 12:17 ` [PATCH 05/10] OMAP3: rx51_defconfig: add twl4030 to rx51 default configuration Tony Lindgren
2009-08-13  9:24   ` Russell King - ARM Linux
2009-08-12 12:18 ` [PATCH 06/10] OMAP3: MMC: Add mux for pins Tony Lindgren
2009-08-13  9:26   ` Russell King - ARM Linux
2009-08-16 15:25     ` [PATCH 06/10] OMAP3: MMC: Add mux for pins, v2 Tony Lindgren
2009-08-12 12:20 ` [PATCH 07/10] OMAP3: Zoom2: Add TWL4030 support Tony Lindgren
2009-08-13  9:27   ` Russell King - ARM Linux
2009-08-16 15:28     ` [PATCH 07/10] OMAP3: Zoom2: Add TWL4030 support,v 2 Tony Lindgren
2009-08-12 12:21 ` [PATCH 08/10] OMAP3: Zoom2: Update board defconfig Tony Lindgren
2009-08-13  9:28   ` Russell King - ARM Linux
2009-08-12 12:22 ` [PATCH 09/10] OMAP3: beagle: add missing twl4030 usb platform_data Tony Lindgren
2009-08-13  9:28   ` Russell King - ARM Linux
2009-08-12 12:24 ` [PATCH 10/10] OMAP3: update OMAP3 Beagle defconfig Tony Lindgren
2009-08-12 12:27   ` Felipe Balbi
2009-08-12 16:52     ` [PATCH 10/10] OMAP3: update OMAP3 Beagle defconfig, v2 Tony Lindgren
2009-08-12 17:20       ` Kevin Hilman
2009-08-12 19:11         ` Felipe Balbi
2009-08-13  7:02           ` Tony Lindgren
2009-08-16  1:48             ` Eric Witcher
2009-08-16 15:42               ` [PATCH 10/10] OMAP3: update OMAP3 Beagle defconfig, v3 Tony Lindgren
2009-08-16 17:07                 ` Felipe Balbi
2009-08-16 17:22                   ` Tony Lindgren
2009-08-19 13:40                 ` Felipe Balbi
2009-08-24 13:05 ` [PATCH 00/10] Omap3 updates for upcoming 2.6.32 merge window Tony Lindgren

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20090816151347.GZ7278@atomide.com \
    --to=tony@atomide.com \
    --cc=Hiroshi.DOYU@nokia.com \
    --cc=linux-arm-kernel@lists.arm.linux.org.uk \
    --cc=linux-omap@vger.kernel.org \
    --cc=linux@arm.linux.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.