thp: remove PG_buddy
PG_buddy can be converted to _mapcount == -2. So the PG_compound_lock can be added to page->flags without overflowing (because of the sparse section bits increasing) with CONFIG_X86_PAE=y and CONFIG_X86_PAT=y. This also has to move the memory hotplug code from _mapcount to lru.next to avoid any risk of clashes. We can't use lru.next for PG_buddy removal, but memory hotplug can use lru.next even more easily than the mapcount instead. Signed-off-by: Andrea Arcangeli <aarcange@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
21ae5b0175
commit
5f24ce5fd3
@ -449,8 +449,8 @@ __find_combined_index(unsigned long page_idx, unsigned int order)
|
||||
* (c) a page and its buddy have the same order &&
|
||||
* (d) a page and its buddy are in the same zone.
|
||||
*
|
||||
* For recording whether a page is in the buddy system, we use PG_buddy.
|
||||
* Setting, clearing, and testing PG_buddy is serialized by zone->lock.
|
||||
* For recording whether a page is in the buddy system, we set ->_mapcount -2.
|
||||
* Setting, clearing, and testing _mapcount -2 is serialized by zone->lock.
|
||||
*
|
||||
* For recording page's order, we use page_private(page).
|
||||
*/
|
||||
@ -483,7 +483,7 @@ static inline int page_is_buddy(struct page *page, struct page *buddy,
|
||||
* as necessary, plus some accounting needed to play nicely with other
|
||||
* parts of the VM system.
|
||||
* At each level, we keep a list of pages, which are heads of continuous
|
||||
* free pages of length of (1 << order) and marked with PG_buddy. Page's
|
||||
* free pages of length of (1 << order) and marked with _mapcount -2. Page's
|
||||
* order is recorded in page_private(page) field.
|
||||
* So when we are allocating or freeing one, we can derive the state of the
|
||||
* other. That is, if we allocate a small block, and both were
|
||||
@ -5574,7 +5574,6 @@ static struct trace_print_flags pageflag_names[] = {
|
||||
{1UL << PG_swapcache, "swapcache" },
|
||||
{1UL << PG_mappedtodisk, "mappedtodisk" },
|
||||
{1UL << PG_reclaim, "reclaim" },
|
||||
{1UL << PG_buddy, "buddy" },
|
||||
{1UL << PG_swapbacked, "swapbacked" },
|
||||
{1UL << PG_unevictable, "unevictable" },
|
||||
#ifdef CONFIG_MMU
|
||||
|
Reference in New Issue
Block a user