From: Hiroshi DOYU <Hiroshi.DOYU@xxxxxxxxx> The fist level iommu page table address is registered with the address conversion function for kmemleak special scan. Depends on: http://groups.google.co.jp/group/linux.kernel/browse_thread/thread/51de33be01acf4e2 Signed-off-by: Hiroshi DOYU <Hiroshi.DOYU@xxxxxxxxx> --- arch/arm/plat-omap/iommu.c | 15 +++++++++++++++ 1 files changed, 15 insertions(+), 0 deletions(-) diff --git a/arch/arm/plat-omap/iommu.c b/arch/arm/plat-omap/iommu.c index 341c481..3381070 100644 --- a/arch/arm/plat-omap/iommu.c +++ b/arch/arm/plat-omap/iommu.c @@ -875,6 +875,16 @@ void iommu_put(struct iommu *obj) } EXPORT_SYMBOL_GPL(iommu_put); +static u32 kmemleak_special_conv(u32 orig) +{ + u32 *iopgd = (u32 *)orig; + + if (!iopgd_is_table(*iopgd)) + return NULL; + + return iopgd_page_vaddr(iopgd); +} + /* * OMAP Device MMU(IOMMU) detection */ @@ -948,6 +958,10 @@ 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); + if (err) + dev_warn(&pdev->dev, "kmemleak: failed to add special scan\n"); + dev_info(&pdev->dev, "%s registered\n", obj->name); return 0; @@ -972,6 +986,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