lkml.org 
[lkml]   [2009]   [Apr]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH 06/14] kmemleak: Add the vmalloc memory allocation/freeing hooks
    From
    Date
    This patch adds the callbacks to kmemleak_(alloc|free) functions from
    vmalloc/vfree.

    Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
    ---
    mm/vmalloc.c | 30 +++++++++++++++++++++++++++---
    1 files changed, 27 insertions(+), 3 deletions(-)

    diff --git a/mm/vmalloc.c b/mm/vmalloc.c
    index fab1987..507f1b1 100644
    --- a/mm/vmalloc.c
    +++ b/mm/vmalloc.c
    @@ -25,6 +25,7 @@
    #include <linux/rcupdate.h>
    #include <linux/bootmem.h>
    #include <linux/pfn.h>
    +#include <linux/kmemleak.h>

    #include <asm/atomic.h>
    #include <asm/uaccess.h>
    @@ -1326,6 +1327,9 @@ static void __vunmap(const void *addr, int deallocate_pages)
    void vfree(const void *addr)
    {
    BUG_ON(in_interrupt());
    +
    + kmemleak_free(addr);
    +
    __vunmap(addr, 1);
    }
    EXPORT_SYMBOL(vfree);
    @@ -1438,8 +1442,17 @@ fail:

    void *__vmalloc_area(struct vm_struct *area, gfp_t gfp_mask, pgprot_t prot)
    {
    - return __vmalloc_area_node(area, gfp_mask, prot, -1,
    - __builtin_return_address(0));
    + void *addr = __vmalloc_area_node(area, gfp_mask, prot, -1,
    + __builtin_return_address(0));
    +
    + /*
    + * A ref_count = 3 is needed because the vm_struct and vmap_area
    + * structures allocated in the __get_vm_area_node() function contain
    + * references to the virtual address of the vmalloc'ed block.
    + */
    + kmemleak_alloc(addr, area->size - PAGE_SIZE, 3, gfp_mask);
    +
    + return addr;
    }

    /**
    @@ -1458,6 +1471,8 @@ static void *__vmalloc_node(unsigned long size, gfp_t gfp_mask, pgprot_t prot,
    int node, void *caller)
    {
    struct vm_struct *area;
    + void *addr;
    + unsigned long real_size = size;

    size = PAGE_ALIGN(size);
    if (!size || (size >> PAGE_SHIFT) > num_physpages)
    @@ -1469,7 +1484,16 @@ static void *__vmalloc_node(unsigned long size, gfp_t gfp_mask, pgprot_t prot,
    if (!area)
    return NULL;

    - return __vmalloc_area_node(area, gfp_mask, prot, node, caller);
    + addr = __vmalloc_area_node(area, gfp_mask, prot, node, caller);
    +
    + /*
    + * A ref_count = 3 is needed because the vm_struct and vmap_area
    + * structures allocated in the __get_vm_area_node() function contain
    + * references to the virtual address of the vmalloc'ed block.
    + */
    + kmemleak_alloc(addr, real_size, 3, gfp_mask);
    +
    + return addr;
    }

    void *__vmalloc(unsigned long size, gfp_t gfp_mask, pgprot_t prot)


    \
     
     \ /
      Last update: 2009-04-24 18:47    [W:0.025 / U:180.184 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site