slub: new_slab_objects() can also get objects from partial list
authorChristoph Lameter <cl@linux.com>
Wed, 9 May 2012 15:09:55 +0000 (10:09 -0500)
committerPekka Enberg <penberg@kernel.org>
Fri, 1 Jun 2012 06:25:40 +0000 (09:25 +0300)
Moving the attempt to get a slab page from the partial lists simplifies
__slab_alloc which is rather complicated.

Signed-off-by: Christoph Lameter <cl@linux.com>
Signed-off-by: Pekka Enberg <penberg@kernel.org>
mm/slub.c

index 5aacd43..b29246b 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -2130,9 +2130,15 @@ static inline void *new_slab_objects(struct kmem_cache *s, gfp_t flags,
                        int node, struct kmem_cache_cpu **pc)
 {
        void *freelist;
-       struct kmem_cache_cpu *c;
-       struct page *page = new_slab(s, flags, node);
+       struct kmem_cache_cpu *c = *pc;
+       struct page *page;
+
+       freelist = get_partial(s, flags, node, c);
 
+       if (freelist)
+               return freelist;
+
+       page = new_slab(s, flags, node);
        if (page) {
                c = __this_cpu_ptr(s->cpu_slab);
                if (c->page)
@@ -2269,11 +2275,7 @@ new_slab:
                goto redo;
        }
 
-       /* Then do expensive stuff like retrieving pages from the partial lists */
-       freelist = get_partial(s, gfpflags, node, c);
-
-       if (!freelist)
-               freelist = new_slab_objects(s, gfpflags, node, &c);
+       freelist = new_slab_objects(s, gfpflags, node, &c);
 
        if (unlikely(!freelist)) {
                if (!(gfpflags & __GFP_NOWARN) && printk_ratelimit())