From: Hiroshi DOYU <Hiroshi.DOYU@xxxxxxxxx> The fist level iommu page table address is registered with the address conversion function for kmemleak special scan. Signed-off-by: Hiroshi DOYU <Hiroshi.DOYU@xxxxxxxxx> --- arch/arm/plat-omap/iommu.c | 19 +++++++++++++++++++ 1 files changed, 19 insertions(+), 0 deletions(-) diff --git a/arch/arm/plat-omap/iommu.c b/arch/arm/plat-omap/iommu.c index a202a2c..5a19e86 100644 --- a/arch/arm/plat-omap/iommu.c +++ b/arch/arm/plat-omap/iommu.c @@ -894,6 +894,19 @@ void iommu_put(struct iommu *obj) } EXPORT_SYMBOL_GPL(iommu_put); +static unsigned long kmemleak_special_conv(void *data, unsigned long orig) +{ + u32 *iopgd; + struct iommu *obj = (struct iommu *)data; + + iopgd = iopgd_offset(obj, orig); + + if (!iopgd_is_table(*iopgd)) + return 0; + + return (u32)iopgd_page_vaddr(iopgd); +} + /* * OMAP Device MMU(IOMMU) detection */ @@ -967,6 +980,11 @@ static int __devinit omap_iommu_probe(struct platform_device *pdev) BUG_ON(!IS_ALIGNED((unsigned long)obj->iopgd, IOPGD_TABLE_SIZE)); + err = kmemleak_special_scan(p, IOPGD_TABLE_SIZE, kmemleak_special_conv, + obj, THIS_MODULE); + if (err) + dev_warn(&pdev->dev, "kmemleak: failed to add special scan\n"); + dev_info(&pdev->dev, "%s registered\n", obj->name); return 0; @@ -991,6 +1009,7 @@ static int __devexit omap_iommu_remove(struct platform_device *pdev) platform_set_drvdata(pdev, NULL); iopgtable_clear_entry_all(obj); + kmemleak_no_special(obj->iopgd); free_pages((unsigned long)obj->iopgd, get_order(IOPGD_TABLE_SIZE)); irq = platform_get_irq(pdev, 0); -- 1.7.1.rc1 -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html