lkml.org 
[lkml]   [2006]   [Sep]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patches in this message
/
Date
From
SubjectRe: kernel BUGs when removing largish files with the SLOB allocator
I changed my patch with some of your suggestions. Anyway, my system
works properly with the patch while the current kernel does not.

From: Aubrey.Li <aubrey@linux-suse.ADI>
Date: Wed, 13 Sep 2006 15:01:23 +0800
Subject: [PATCH] Make the SLOB allocator mark its pages with PG_slab.
Signed-off-by: Aubrey.Li <aubrey.adi@gmail.com>
---
mm/slob.c | 20 ++++++++++++++------
1 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/mm/slob.c b/mm/slob.c
index 7b52b20..05f0d16 100644
--- a/mm/slob.c
+++ b/mm/slob.c
@@ -109,6 +109,7 @@ static void *slob_alloc(size_t size, gfp

slob_free(cur, PAGE_SIZE);
spin_lock_irqsave(&slob_lock, flags);
+ SetPageSlab(virt_to_page(cur));
cur = slobfree;
}
}
@@ -173,12 +174,17 @@ void *kmalloc(size_t size, gfp_t gfp)
return 0;

bb->order = find_order(size);
- bb->pages = (void *)__get_free_pages(gfp, bb->order);
+ page = alloc_pages(gfp, bb->order);
+ bb->pages = page_address(page);

if (bb->pages) {
spin_lock_irqsave(&block_lock, flags);
bb->next = bigblocks;
bigblocks = bb;
+ for (i = 0; i < (1 << bb->order); i++) {
+ SetPageSlab(page);
+ page++;
+ }
spin_unlock_irqrestore(&block_lock, flags);
return bb->pages;
}
@@ -202,8 +208,15 @@ void kfree(const void *block)
spin_lock_irqsave(&block_lock, flags);
for (bb = bigblocks; bb; last = &bb->next, bb = bb->next) {
if (bb->pages == block) {
+ struct page *page = virt_to_page(bb->pages);
+ int i;
+
*last = bb->next;
spin_unlock_irqrestore(&block_lock, flags);
+ for (i = 0; i < (1 << bb->order); i++) {
+ ClearPageSlab(page);
+ page++;
+ }
free_pages((unsigned long)block, bb->order);
slob_free(bb, sizeof(bigblock_t));
return;
@@ -332,11 +345,6 @@ static struct timer_list slob_timer = TI

void kmem_cache_init(void)
{
- void *p = slob_alloc(PAGE_SIZE, 0, PAGE_SIZE-1);
-
- if (p)
- free_page((unsigned long)p);
-
mod_timer(&slob_timer, jiffies + HZ);
}

--
1.4.0From 6e2e615a2f59f5b8d1b8312c5f8cc596b927be9f Mon Sep 17 00:00:00 2001
From: Aubrey.Li <aubrey@linux-suse.ADI>
Date: Wed, 13 Sep 2006 15:01:23 +0800
Subject: [PATCH] Make the SLOB allocator mark its pages with PG_slab.
Signed-off-by: Aubrey.Li <aubrey.adi@gmail.com>
---
mm/slob.c | 20 ++++++++++++++------
1 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/mm/slob.c b/mm/slob.c
index 7b52b20..05f0d16 100644
--- a/mm/slob.c
+++ b/mm/slob.c
@@ -109,6 +109,7 @@ static void *slob_alloc(size_t size, gfp

slob_free(cur, PAGE_SIZE);
spin_lock_irqsave(&slob_lock, flags);
+ SetPageSlab(virt_to_page(cur));
cur = slobfree;
}
}
@@ -173,12 +174,17 @@ void *kmalloc(size_t size, gfp_t gfp)
return 0;

bb->order = find_order(size);
- bb->pages = (void *)__get_free_pages(gfp, bb->order);
+ page = alloc_pages(gfp, bb->order);
+ bb->pages = page_address(page);

if (bb->pages) {
spin_lock_irqsave(&block_lock, flags);
bb->next = bigblocks;
bigblocks = bb;
+ for (i = 0; i < (1 << bb->order); i++) {
+ SetPageSlab(page);
+ page++;
+ }
spin_unlock_irqrestore(&block_lock, flags);
return bb->pages;
}
@@ -202,8 +208,15 @@ void kfree(const void *block)
spin_lock_irqsave(&block_lock, flags);
for (bb = bigblocks; bb; last = &bb->next, bb = bb->next) {
if (bb->pages == block) {
+ struct page *page = virt_to_page(bb->pages);
+ int i;
+
*last = bb->next;
spin_unlock_irqrestore(&block_lock, flags);
+ for (i = 0; i < (1 << bb->order); i++) {
+ ClearPageSlab(page);
+ page++;
+ }
free_pages((unsigned long)block, bb->order);
slob_free(bb, sizeof(bigblock_t));
return;
@@ -332,11 +345,6 @@ static struct timer_list slob_timer = TI

void kmem_cache_init(void)
{
- void *p = slob_alloc(PAGE_SIZE, 0, PAGE_SIZE-1);
-
- if (p)
- free_page((unsigned long)p);
-
mod_timer(&slob_timer, jiffies + HZ);
}

--
1.4.0
\
 
 \ /
  Last update: 2006-09-13 09:25    [W:0.148 / U:0.052 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site