Messages in this thread Patch in this message | | | From | Catalin Marinas <> | Subject | [PATCH 2.6.17-rc5 4/8] Modules support for kmemleak | Date | Sun, 04 Jun 2006 23:00:32 +0100 |
| |
From: Catalin Marinas <catalin.marinas@arm.com>
This patch handles the kmemleak operations needed for modules loading so that memory allocations from inside a module are properly tracked.
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com> ---
kernel/module.c | 32 ++++++++++++++++++++++++++++++++ 1 files changed, 32 insertions(+), 0 deletions(-)
diff --git a/kernel/module.c b/kernel/module.c index bbe0486..2b66374 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -1413,6 +1413,9 @@ static struct module *load_module(void _ exportindex, modindex, obsparmindex, infoindex, gplindex, crcindex, gplcrcindex, versindex, pcpuindex, gplfutureindex, gplfuturecrcindex; +#ifdef CONFIG_DEBUG_MEMLEAK + unsigned int dataindex, bssindex, mloffindex; +#endif struct module *mod; long err = 0; void *percpu = NULL, *ptr = NULL; /* Stops spurious gcc warning */ @@ -1510,6 +1513,11 @@ #ifdef CONFIG_KALLSYMS sechdrs[symindex].sh_flags |= SHF_ALLOC; sechdrs[strindex].sh_flags |= SHF_ALLOC; #endif +#ifdef CONFIG_DEBUG_MEMLEAK + dataindex = find_sec(hdr, sechdrs, secstrings, ".data"); + bssindex = find_sec(hdr, sechdrs, secstrings, ".bss"); + mloffindex = find_sec(hdr, sechdrs, secstrings, ".init.memleak_offsets"); +#endif /* Check module struct version now, before we try to use module. */ if (!check_modstruct_version(sechdrs, versindex, mod)) { @@ -1569,6 +1577,7 @@ #endif /* Do the allocs. */ ptr = module_alloc(mod->core_size); + memleak_not_leak(ptr); if (!ptr) { err = -ENOMEM; goto free_percpu; @@ -1577,6 +1586,7 @@ #endif mod->module_core = ptr; ptr = module_alloc(mod->init_size); + memleak_ignore(ptr); if (!ptr && mod->init_size) { err = -ENOMEM; goto free_core; @@ -1608,6 +1618,28 @@ #endif /* Module has been moved. */ mod = (void *)sechdrs[modindex].sh_addr; +#ifdef CONFIG_DEBUG_MEMLEAK + if (mloffindex) + memleak_insert_aliases((void *)sechdrs[mloffindex].sh_addr, + (void *)sechdrs[mloffindex].sh_addr + + sechdrs[mloffindex].sh_size); + + /* only scan the sections containing data */ + memleak_scan_area(mod->module_core, + (unsigned long)mod - (unsigned long)mod->module_core, + sizeof(struct module)); + if (dataindex) + memleak_scan_area(mod->module_core, + sechdrs[dataindex].sh_addr + - (unsigned long)mod->module_core, + sechdrs[dataindex].sh_size); + if (bssindex) + memleak_scan_area(mod->module_core, + sechdrs[bssindex].sh_addr + - (unsigned long)mod->module_core, + sechdrs[bssindex].sh_size); +#endif + /* Now we've moved module, initialize linked lists, etc. */ module_unload_init(mod); - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |