Slab does not need to use the page refcount at all, and it can avoid an atomic operation on page free. Hugetlb wants to delay setting the refcount until it has assembled a complete gigantic page. We already have the ability to freeze a page (safely reduce its reference count to 0), so this patchset adds APIs to allocate and free pages which are in a frozen state. This patchset is also a step towards the Glorious Future in which struct page doesn't have a refcount; the users which need a refcount will have one in their per-allocation memdesc. Compared to v1, this patchset has been tested and survives a few hours of xfstests. Vlastimil fixed a bug where compaction needed to initialise the page refcount itself. As part of that debugging, I split the old 4/6 into ten patches; I've opted to leave it that way to aid anybody else trying to bisect a bug in these patches in future. I also dropped the old patch 1/6 and replaced it with one that moves the call to page_zone() a few lines earlier to reflect other changes that were made to page_alloc. Matthew Wilcox (Oracle) (16): mm/page_alloc: Cache page_zone() result in free_unref_page() mm/page_alloc: Rename free_the_page() to free_frozen_pages() mm/page_alloc: Export free_frozen_pages() instead of free_unref_page() mm/page_alloc: Move set_page_refcounted() to callers of post_alloc_hook() mm/page_alloc: Move set_page_refcounted() to callers of prep_new_page() mm/page_alloc: Move set_page_refcounted() to callers of get_page_from_freelist() mm/page_alloc: Move set_page_refcounted() to callers of __alloc_pages_cpuset_fallback() mm/page_alloc: Move set_page_refcounted() to callers of __alloc_pages_may_oom() mm/page_alloc: Move set_page_refcounted() to callers of __alloc_pages_direct_compact() mm/page_alloc: Move set_page_refcounted() to callers of __alloc_pages_direct_reclaim() mm/page_alloc: Move set_page_refcounted() to callers of __alloc_pages_slowpath() mm/page_alloc: Move set_page_refcounted() to end of __alloc_pages() mm/page_alloc: Add __alloc_frozen_pages() mm/mempolicy: Add alloc_frozen_pages() slab: Allocate frozen pages slub: Allocate frozen pages mm/compaction.c | 1 + mm/internal.h | 15 ++++++++++-- mm/mempolicy.c | 61 ++++++++++++++++++++++++++++++------------------- mm/page_alloc.c | 53 +++++++++++++++++++++++++----------------- mm/slab.c | 23 +++++++++---------- mm/slub.c | 26 ++++++++++----------- mm/swap.c | 2 +- 7 files changed, 109 insertions(+), 72 deletions(-) -- 2.35.1