lkml.org 
[lkml]   [2008]   [Jul]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH 4/4] kmemtrace: SLOB hooks.
    Date
    This adds hooks for the SLOB allocator, to allow tracing with kmemtrace.

    Signed-off-by: Eduard - Gabriel Munteanu <eduard.munteanu@linux360.ro>
    ---
    mm/slob.c | 37 +++++++++++++++++++++++++++++++------
    1 files changed, 31 insertions(+), 6 deletions(-)

    diff --git a/mm/slob.c b/mm/slob.c
    index a3ad667..0335c01 100644
    --- a/mm/slob.c
    +++ b/mm/slob.c
    @@ -65,6 +65,7 @@
    #include <linux/module.h>
    #include <linux/rcupdate.h>
    #include <linux/list.h>
    +#include <linux/kmemtrace.h>
    #include <asm/atomic.h>

    /*
    @@ -463,27 +464,38 @@ void *__kmalloc_node(size_t size, gfp_t gfp, int node)
    {
    unsigned int *m;
    int align = max(ARCH_KMALLOC_MINALIGN, ARCH_SLAB_MINALIGN);
    + void *ret;

    if (size < PAGE_SIZE - align) {
    if (!size)
    return ZERO_SIZE_PTR;

    m = slob_alloc(size + align, gfp, align, node);
    +
    if (!m)
    return NULL;
    *m = size;
    - return (void *)m + align;
    + ret = (void *)m + align;
    +
    + kmemtrace_mark_alloc_node(KMEMTRACE_TYPE_KERNEL,
    + _RET_IP_, ret,
    + size, size + align, gfp, node);
    } else {
    - void *ret;
    + unsigned int order = get_order(size);

    - ret = slob_new_page(gfp | __GFP_COMP, get_order(size), node);
    + ret = slob_new_page(gfp | __GFP_COMP, order, node);
    if (ret) {
    struct page *page;
    page = virt_to_page(ret);
    page->private = size;
    }
    - return ret;
    +
    + kmemtrace_mark_alloc_node(KMEMTRACE_TYPE_KERNEL,
    + _RET_IP_, ret,
    + size, PAGE_SIZE << order, gfp, node);
    }
    +
    + return ret;
    }
    EXPORT_SYMBOL(__kmalloc_node);

    @@ -501,6 +513,8 @@ void kfree(const void *block)
    slob_free(m, *m + align);
    } else
    put_page(&sp->page);
    +
    + kmemtrace_mark_free(KMEMTRACE_TYPE_KERNEL, _RET_IP_, block);
    }
    EXPORT_SYMBOL(kfree);

    @@ -569,10 +583,19 @@ void *kmem_cache_alloc_node(struct kmem_cache *c, gfp_t flags, int node)
    {
    void *b;

    - if (c->size < PAGE_SIZE)
    + if (c->size < PAGE_SIZE) {
    b = slob_alloc(c->size, flags, c->align, node);
    - else
    + kmemtrace_mark_alloc_node(KMEMTRACE_TYPE_CACHE,
    + _RET_IP_, b, c->size,
    + SLOB_UNITS(c->size) * SLOB_UNIT,
    + flags, node);
    + } else {
    b = slob_new_page(flags, get_order(c->size), node);
    + kmemtrace_mark_alloc_node(KMEMTRACE_TYPE_CACHE,
    + _RET_IP_, b, c->size,
    + PAGE_SIZE << get_order(c->size),
    + flags, node);
    + }

    if (c->ctor)
    c->ctor(c, b);
    @@ -608,6 +631,8 @@ void kmem_cache_free(struct kmem_cache *c, void *b)
    } else {
    __kmem_cache_free(b, c->size);
    }
    +
    + kmemtrace_mark_free(KMEMTRACE_TYPE_CACHE, _RET_IP_, b);
    }
    EXPORT_SYMBOL(kmem_cache_free);

    --
    1.5.6.1


    \
     
     \ /
      Last update: 2008-07-17 02:51    [W:0.059 / U:30.240 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site