Linux Headquarters
[ Register ]
[ About us ] [ Home Page ]

Advertisement
[ Kernel ] [ Documentation ] [ Links ] [ Books ]

Advertisement

Kernel v2.6.24 /mm/slob.c

Filename:/mm/slob.c
Lines Added:11
Lines Deleted:8
Also changed in: (Previous) 2.6.24-rc8  2.6.24-rc7  2.6.24-rc6  2.6.24-rc5  2.6.24-rc4-git7  2.6.24-rc4-git6 
(Following) 2.6.24-git15  2.6.24-git16  2.6.24-git17  2.6.24-git18  2.6.24-git19  2.6.24-git20 

Location
[  2.6.24
  [  mm
     o  slob.c

Patch

diff --git a/mm/slob.c b/mm/slob.c
index ec33fcd..773a7aa 100644
--- a/mm/slob.c
+++ b/mm/slob.c
@@ -321,7 +321,8 @@ static void *slob_alloc(size_t size, gfp_t gfp, int align, int node)
       /* Improve fragment distribution and reduce our average
        * search time by starting our next search here. (see
        * Knuth vol 1, sec 2.5, pg 449) */
-      if (free_slob_pages.next != prev->next)
+      if (prev != free_slob_pages.prev &&
+            free_slob_pages.next != prev->next)
          list_move_tail(&free_slob_pages, prev->next);
       break;
    }
@@ -329,7 +330,7 @@ static void *slob_alloc(size_t size, gfp_t gfp, int align, int node)
 
    /* Not enough space: must allocate a new page */
    if (!b) {
-      b = slob_new_page(gfp, 0, node);
+      b = slob_new_page(gfp & ~__GFP_ZERO, 0, node);
       if (!b)
          return 0;
       sp = (struct slob_page *)virt_to_page(b);
@@ -360,7 +361,7 @@ static void slob_free(void *block, int size)
    slobidx_t units;
    unsigned long flags;
 
-   if (ZERO_OR_NULL_PTR(block))
+   if (unlikely(ZERO_OR_NULL_PTR(block)))
       return;
    BUG_ON(!size);
 
@@ -466,7 +467,7 @@ void kfree(const void *block)
 {
    struct slob_page *sp;
 
-   if (ZERO_OR_NULL_PTR(block))
+   if (unlikely(ZERO_OR_NULL_PTR(block)))
       return;
 
    sp = (struct slob_page *)virt_to_page(block);
@@ -484,7 +485,8 @@ size_t ksize(const void *block)
 {
    struct slob_page *sp;
 
-   if (ZERO_OR_NULL_PTR(block))
+   BUG_ON(!block);
+   if (unlikely(block == ZERO_SIZE_PTR))
       return 0;
 
    sp = (struct slob_page *)virt_to_page(block);
@@ -493,17 +495,18 @@ size_t ksize(const void *block)
    else
       return sp->page.private;
 }
+EXPORT_SYMBOL(ksize);
 
 struct kmem_cache {
    unsigned int size, align;
    unsigned long flags;
    const char *name;
-   void (*ctor)(void *, struct kmem_cache *, unsigned long);
+   void (*ctor)(struct kmem_cache *, void *);
 };
 
 struct kmem_cache *kmem_cache_create(const char *name, size_t size,
    size_t align, unsigned long flags,
-   void (*ctor)(void*, struct kmem_cache *, unsigned long))
+   void (*ctor)(struct kmem_cache *, void *))
 {
    struct kmem_cache *c;
 
@@ -547,7 +550,7 @@ void *kmem_cache_alloc_node(struct kmem_cache *c, gfp_t flags, int node)
       b = slob_new_page(flags, get_order(c->size), node);
 
    if (c->ctor)
-      c->ctor(b, c, 0);
+      c->ctor(c, b);
 
    return b;
 }


Comments: webmaster (at) linuxhq.com.
Advertising: banners (at) linuxhq.com.
Compilation ©1998-2008 Linux Headquarters, Inc.