You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
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
+8
-6
@@ -82,9 +82,10 @@ static void release_memory_resource(struct resource *res)
|
||||
|
||||
#ifdef CONFIG_MEMORY_HOTPLUG_SPARSE
|
||||
#ifndef CONFIG_SPARSEMEM_VMEMMAP
|
||||
static void get_page_bootmem(unsigned long info, struct page *page, int type)
|
||||
static void get_page_bootmem(unsigned long info, struct page *page,
|
||||
unsigned long type)
|
||||
{
|
||||
atomic_set(&page->_mapcount, type);
|
||||
page->lru.next = (struct list_head *) type;
|
||||
SetPagePrivate(page);
|
||||
set_page_private(page, info);
|
||||
atomic_inc(&page->_count);
|
||||
@@ -94,15 +95,16 @@ static void get_page_bootmem(unsigned long info, struct page *page, int type)
|
||||
* so use __ref to tell modpost not to generate a warning */
|
||||
void __ref put_page_bootmem(struct page *page)
|
||||
{
|
||||
int type;
|
||||
unsigned long type;
|
||||
|
||||
type = atomic_read(&page->_mapcount);
|
||||
BUG_ON(type >= -1);
|
||||
type = (unsigned long) page->lru.next;
|
||||
BUG_ON(type < MEMORY_HOTPLUG_MIN_BOOTMEM_TYPE ||
|
||||
type > MEMORY_HOTPLUG_MAX_BOOTMEM_TYPE);
|
||||
|
||||
if (atomic_dec_return(&page->_count) == 1) {
|
||||
ClearPagePrivate(page);
|
||||
set_page_private(page, 0);
|
||||
reset_page_mapcount(page);
|
||||
INIT_LIST_HEAD(&page->lru);
|
||||
__free_pages_bootmem(page, 0);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user