lkml.org 
[lkml]   [2006]   [Jun]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 2.6.17-rc6 4/9] Modules support for kmemleak
    Date
    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/
    \
     
     \ /
      Last update: 2006-06-11 13:25    [W:2.119 / U:0.164 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site