diff options
author | Andrea Arcangeli <aarcange@redhat.com> | 2011-01-13 18:47:00 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-01-13 20:32:43 -0500 |
commit | 5f24ce5fd34c3ca1b3d10d30da754732da64d5c0 (patch) | |
tree | c82d27461f2adda210e77808b7dd04eaec017f2f /mm/page_alloc.c | |
parent | 21ae5b01750f14140809508a478a4413792e0261 (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.c | 7 |
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 |