Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 420256ef authored by Xiao Guangrong's avatar Xiao Guangrong Committed by Linus Torvalds
Browse files

thp: release page in page pre-alloc path



If NUMA is enabled, we can release the page in the page pre-alloc
operation, then the CONFIG_NUMA dependent code can be reduced

Signed-off-by: default avatarXiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Cc: Hugh Dickins <hughd@google.com>
Cc: David Rientjes <rientjes@google.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent d516904b
Loading
Loading
Loading
Loading
+7 −12
Original line number Diff line number Diff line
@@ -1873,15 +1873,12 @@ static void collapse_huge_page(struct mm_struct *mm,
		*hpage = ERR_PTR(-ENOMEM);
		return;
	}
	*hpage = new_page;
	count_vm_event(THP_COLLAPSE_ALLOC);
#endif

	if (unlikely(mem_cgroup_newpage_charge(new_page, mm, GFP_KERNEL))) {
#ifdef CONFIG_NUMA
		put_page(new_page);
#endif
	if (unlikely(mem_cgroup_newpage_charge(new_page, mm, GFP_KERNEL)))
		return;
	}

	/*
	 * Prevent all access to pagetables with the exception of
@@ -1982,9 +1979,8 @@ static void collapse_huge_page(struct mm_struct *mm,
	prepare_pmd_huge_pte(pgtable, mm);
	spin_unlock(&mm->page_table_lock);

#ifndef CONFIG_NUMA
	*hpage = NULL;
#endif

	khugepaged_pages_collapsed++;
out_up_write:
	up_write(&mm->mmap_sem);
@@ -1992,9 +1988,6 @@ static void collapse_huge_page(struct mm_struct *mm,

out:
	mem_cgroup_uncharge_page(new_page);
#ifdef CONFIG_NUMA
	put_page(new_page);
#endif
	goto out_up_write;
}

@@ -2260,8 +2253,6 @@ static void khugepaged_do_scan(void)
	barrier(); /* write khugepaged_pages_to_scan to local stack */

	while (progress < pages) {
		cond_resched();

#ifndef CONFIG_NUMA
		if (!hpage)
			hpage = khugepaged_alloc_hugepage(&wait);
@@ -2274,8 +2265,12 @@ static void khugepaged_do_scan(void)
				break;
			wait = false;
			khugepaged_alloc_sleep();
		} else if (hpage) {
			put_page(hpage);
			hpage = NULL;
		}
#endif
		cond_resched();

		if (unlikely(kthread_should_stop() || freezing(current)))
			break;