aboutsummaryrefslogtreecommitdiffstats
path: root/mm/page_alloc.c
diff options
context:
space:
mode:
authorAndrea Arcangeli <aarcange@redhat.com>2011-01-13 18:47:00 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2011-01-13 20:32:43 -0500
commit5f24ce5fd34c3ca1b3d10d30da754732da64d5c0 (patch)
treec82d27461f2adda210e77808b7dd04eaec017f2f /mm/page_alloc.c
parent21ae5b01750f14140809508a478a4413792e0261 (diff)
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>
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r--mm/page_alloc.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index e7664b9f706c..9dfe49bceff4 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -449,8 +449,8 @@ __find_combined_index(unsigned long page_idx, unsigned int order)
449 * (c) a page and its buddy have the same order && 449 * (c) a page and its buddy have the same order &&
450 * (d) a page and its buddy are in the same zone. 450 * (d) a page and its buddy are in the same zone.
451 * 451 *
452 * For recording whether a page is in the buddy system, we use PG_buddy. 452 * For recording whether a page is in the buddy system, we set ->_mapcount -2.
453 * Setting, clearing, and testing PG_buddy is serialized by zone->lock. 453 * Setting, clearing, and testing _mapcount -2 is serialized by zone->lock.
454 * 454 *
455 * For recording page's order, we use page_private(page). 455 * For recording page's order, we use page_private(page).
456 */ 456 */
@@ -483,7 +483,7 @@ static inline int page_is_buddy(struct page *page, struct page *buddy,
483 * as necessary, plus some accounting needed to play nicely with other 483 * as necessary, plus some accounting needed to play nicely with other
484 * parts of the VM system. 484 * parts of the VM system.
485 * At each level, we keep a list of pages, which are heads of continuous 485 * At each level, we keep a list of pages, which are heads of continuous
486 * free pages of length of (1 << order) and marked with PG_buddy. Page's 486 * free pages of length of (1 << order) and marked with _mapcount -2. Page's
487 * order is recorded in page_private(page) field. 487 * order is recorded in page_private(page) field.
488 * So when we are allocating or freeing one, we can derive the state of the 488 * So when we are allocating or freeing one, we can derive the state of the
489 * other. That is, if we allocate a small block, and both were 489 * other. That is, if we allocate a small block, and both were
@@ -5574,7 +5574,6 @@ static struct trace_print_flags pageflag_names[] = {
5574 {1UL << PG_swapcache, "swapcache" }, 5574 {1UL << PG_swapcache, "swapcache" },
5575 {1UL << PG_mappedtodisk, "mappedtodisk" }, 5575 {1UL << PG_mappedtodisk, "mappedtodisk" },
5576 {1UL << PG_reclaim, "reclaim" }, 5576 {1UL << PG_reclaim, "reclaim" },
5577 {1UL << PG_buddy, "buddy" },
5578 {1UL << PG_swapbacked, "swapbacked" }, 5577 {1UL << PG_swapbacked, "swapbacked" },
5579 {1UL << PG_unevictable, "unevictable" }, 5578 {1UL << PG_unevictable, "unevictable" },
5580#ifdef CONFIG_MMU 5579#ifdef CONFIG_MMU