slub: reduce failure of this_cpu_cmpxchg in put_cpu_partial() after unfreezing
authorJoonsoo Kim <js1304@gmail.com>
Fri, 22 Jun 2012 18:22:38 +0000 (03:22 +0900)
committerPekka Enberg <penberg@kernel.org>
Thu, 16 Aug 2012 07:06:42 +0000 (10:06 +0300)
In current implementation, after unfreezing, we doesn't touch oldpage,
so it remain 'NOT NULL'. When we call this_cpu_cmpxchg()
with this old oldpage, this_cpu_cmpxchg() is mostly be failed.

We can change value of oldpage to NULL after unfreezing,
because unfreeze_partial() ensure that all the cpu partial slabs is removed
from cpu partial list. In this time, we could expect that
this_cpu_cmpxchg is mostly succeed.

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

index e131084e87a30e09980b2a0dc1a8866b254d9fd8..c67bd0a4a952bed22432e5d2a86d269bb9991bae 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -1962,6 +1962,7 @@ int put_cpu_partial(struct kmem_cache *s, struct page *page, int drain)
                                local_irq_save(flags);
                                unfreeze_partials(s);
                                local_irq_restore(flags);
+                               oldpage = NULL;
                                pobjects = 0;
                                pages = 0;
                                stat(s, CPU_PARTIAL_DRAIN);