lkml.org 
[lkml]   [2007]   [Jun]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH] SLOB allocator imcompatible SLAB
    Because the page which SLOB allocator got does not have PG_slab,
    I put back the result that kobjsize made a mistake in.

    allocateしたページにPG_slabを付ける必要があるのでは無いでしょうか。
    I need to add PG_slab to the allocate page, and will not there be it?

    Signed-off-by: Yoshinori Sato <ysato@users.sourceforge.jp>

    diff --git a/mm/slob.c b/mm/slob.c
    index 71976c5..d10bcda 100644
    --- a/mm/slob.c
    +++ b/mm/slob.c
    @@ -73,6 +73,21 @@ static DEFINE_SPINLOCK(block_lock);
    static void slob_free(void *b, int size);
    static void slob_timer_cbk(void);

    +static inline void set_slabflags(const void *ptr, int order)
    +{
    + int i;
    + struct page *page = virt_to_page(ptr);
    + for (i = 0; i < (1 << order); i++)
    + __SetPageSlab(page++);
    +}
    +
    +static inline void clear_slabflags(const void *ptr, int order)
    +{
    + int i;
    + struct page *page = virt_to_page(ptr);
    + for (i = 0; i < (1 << order); i++)
    + __ClearPageSlab(page++);
    +}

    static void *slob_alloc(size_t size, gfp_t gfp, int align)
    {
    @@ -180,6 +195,7 @@ void *__kmalloc(size_t size, gfp_t gfp)
    bb->pages = (void *)__get_free_pages(gfp, bb->order);

    if (bb->pages) {
    + set_slabflags(bb->pages, bb->order);
    spin_lock_irqsave(&block_lock, flags);
    bb->next = bigblocks;
    bigblocks = bb;
    @@ -240,6 +256,7 @@ void kfree(const void *block)
    if (bb->pages == block) {
    *last = bb->next;
    spin_unlock_irqrestore(&block_lock, flags);
    + clear_slabflags(block, bb->order);
    free_pages((unsigned long)block, bb->order);
    slob_free(bb, sizeof(bigblock_t));
    return;
    @@ -323,9 +340,11 @@ void *kmem_cache_alloc(struct kmem_cache *c, gfp_t flags)

    if (c->size < PAGE_SIZE)
    b = slob_alloc(c->size, flags, c->align);
    - else
    + else {
    b = (void *)__get_free_pages(flags, get_order(c->size));
    -
    + if (b)
    + set_slabflags(b, get_order(c->size));
    + }
    if (c->ctor)
    c->ctor(b, c, 0);

    @@ -347,8 +366,10 @@ static void __kmem_cache_free(void *b, int size)
    {
    if (size < PAGE_SIZE)
    slob_free(b, size);
    - else
    + else {
    + clear_slabflags(b, get_order(size));
    free_pages((unsigned long)b, get_order(size));
    + }
    }

    static void kmem_rcu_free(struct rcu_head *head)
    --
    Yoshinori Sato
    <ysato@users.sourceforge.jp>
    -
    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: 2007-06-22 10:13    [W:0.024 / U:30.988 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site