slub: use free_page instead of put_page for freeing kmalloc allocation
authorGlauber Costa <glommer@parallels.com>
Fri, 3 Aug 2012 18:51:37 +0000 (22:51 +0400)
committerPekka Enberg <penberg@kernel.org>
Thu, 16 Aug 2012 06:25:03 +0000 (09:25 +0300)
When freeing objects, the slub allocator will most of the time free
empty pages by calling __free_pages(). But high-order kmalloc will be
diposed by means of put_page() instead. It makes no sense to call
put_page() in kernel pages that are provided by the object allocators,
so we shouldn't be doing this ourselves. Aside from the consistency
change, we don't change the flow too much. put_page()'s would call its
dtor function, which is __free_pages. We also already do all of the
Compound page tests ourselves, and the Mlock test we lose don't really
matter.

Signed-off-by: Glauber Costa <glommer@parallels.com>
Acked-by: Christoph Lameter <cl@linux.com>
CC: David Rientjes <rientjes@google.com>
CC: Pekka Enberg <penberg@kernel.org>
Signed-off-by: Pekka Enberg <penberg@kernel.org>
mm/slub.c

index 8f78e25770317e63a37c741d66c2761f71afa2e9..c83fe96f5e421204bfd5c607da97cf590f2cc040 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -3477,7 +3477,7 @@ void kfree(const void *x)
        if (unlikely(!PageSlab(page))) {
                BUG_ON(!PageCompound(page));
                kmemleak_free(x);
-               put_page(page);
+               __free_pages(page, compound_order(page));
                return;
        }
        slab_free(page->slab, page, object, _RET_IP_);