From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753027AbXFVIJ4 (ORCPT ); Fri, 22 Jun 2007 04:09:56 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1752184AbXFVIJm (ORCPT ); Fri, 22 Jun 2007 04:09:42 -0400 Received: from mail1.asahi-net.or.jp ([202.224.39.197]:9156 "EHLO mail.asahi-net.or.jp" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751547AbXFVIJk (ORCPT ); Fri, 22 Jun 2007 04:09:40 -0400 Date: Fri, 22 Jun 2007 17:08:07 +0900 Message-ID: From: Yoshinori Sato To: Matt Mackall Cc: lkml Subject: [PATCH] SLOB allocator imcompatible SLAB User-Agent: Wanderlust/2.15.5 (Almost Unreal) SEMI/1.14.6 (Maruoka) FLIM/1.14.8 (=?ISO-8859-4?Q?Shij=F2?=) APEL/10.6 Emacs/22.0.93 (i486-pc-linux-gnu) MULE/5.0 (SAKAKI) Organization: SIOS Technology, Inc. MIME-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Content-Type: text/plain; charset=ISO-2022-JP Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org 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 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