summaryrefslogtreecommitdiffstats
path: root/mm/slub.c
diff options
context:
space:
mode:
authorChristoph Lameter2012-05-09 17:09:55 +0200
committerPekka Enberg2012-06-01 08:25:40 +0200
commit188fd063208942a4681d8e8a4484ad0d4ae0fda1 (patch)
treed00d4b5884aa9ecb381be41220fb2b42c0a4c27a /mm/slub.c
parentslub: Simplify control flow in __slab_alloc() (diff)
downloadkernel-qcow2-linux-188fd063208942a4681d8e8a4484ad0d4ae0fda1.tar.gz
kernel-qcow2-linux-188fd063208942a4681d8e8a4484ad0d4ae0fda1.tar.xz
kernel-qcow2-linux-188fd063208942a4681d8e8a4484ad0d4ae0fda1.zip
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>
Diffstat (limited to 'mm/slub.c')
-rw-r--r--mm/slub.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/mm/slub.c b/mm/slub.c
index 5aacd434e2cb..b29246bc7392 100644
--- 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())