slub: new_slab_objects() can also get objects from partial list
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>
diff --git a/mm/slub.c b/mm/slub.c
index 5aacd43..b29246b 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -2130,9 +2130,15 @@
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 @@
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())