From 5e021e6db90e58618ccd8424b7c6122f3bbf9ea1 Mon Sep 17 00:00:00 2001 From: Shaohua Li Date: Mon, 14 Nov 2011 13:34:13 +0800 Subject: [PATCH] --- yaml --- r: 276041 b: refs/heads/master c: 9ada19342b2441f290f0043ed7c562682c8c4ede h: refs/heads/master i: 276039: 2f217b7d39a2df7e31a012c115c7a6576443d9b3 v: v3 --- [refs] | 2 +- trunk/mm/slub.c | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index fd5b6219438c..49114471e7c2 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: f64ae042d94d376b54e7a343d93c48561e9d2e16 +refs/heads/master: 9ada19342b2441f290f0043ed7c562682c8c4ede diff --git a/trunk/mm/slub.c b/trunk/mm/slub.c index 60e16c43f88c..00efbb56a268 100644 --- a/trunk/mm/slub.c +++ b/trunk/mm/slub.c @@ -1862,7 +1862,7 @@ static void unfreeze_partials(struct kmem_cache *s) { struct kmem_cache_node *n = NULL; struct kmem_cache_cpu *c = this_cpu_ptr(s->cpu_slab); - struct page *page; + struct page *page, *discard_page = NULL; while ((page = c->partial)) { enum slab_modes { M_PARTIAL, M_FREE }; @@ -1916,14 +1916,22 @@ static void unfreeze_partials(struct kmem_cache *s) "unfreezing slab")); if (m == M_FREE) { - stat(s, DEACTIVATE_EMPTY); - discard_slab(s, page); - stat(s, FREE_SLAB); + page->next = discard_page; + discard_page = page; } } if (n) spin_unlock(&n->list_lock); + + while (discard_page) { + page = discard_page; + discard_page = discard_page->next; + + stat(s, DEACTIVATE_EMPTY); + discard_slab(s, page); + stat(s, FREE_SLAB); + } } /*