diff options
author | Glauber Costa <glommer@parallels.com> | 2012-08-03 14:51:37 -0400 |
---|---|---|
committer | Pekka Enberg <penberg@kernel.org> | 2012-08-16 02:25:03 -0400 |
commit | d9b7f22623b5fa9cc189581dcdfb2ac605933bf4 (patch) | |
tree | 6287535fbe9d67a743c2c16551042447a1e7d424 /mm/slub.c | |
parent | 0d7614f09c1ebdbaa1599a5aba7593f147bf96ee (diff) |
slub: use free_page instead of put_page for freeing kmalloc allocation
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>
Diffstat (limited to 'mm/slub.c')
-rw-r--r-- | mm/slub.c | 2 |
1 files changed, 1 insertions, 1 deletions
@@ -3477,7 +3477,7 @@ void kfree(const void *x) | |||
3477 | if (unlikely(!PageSlab(page))) { | 3477 | if (unlikely(!PageSlab(page))) { |
3478 | BUG_ON(!PageCompound(page)); | 3478 | BUG_ON(!PageCompound(page)); |
3479 | kmemleak_free(x); | 3479 | kmemleak_free(x); |
3480 | put_page(page); | 3480 | __free_pages(page, compound_order(page)); |
3481 | return; | 3481 | return; |
3482 | } | 3482 | } |
3483 | slab_free(page->slab, page, object, _RET_IP_); | 3483 | slab_free(page->slab, page, object, _RET_IP_); |