It is used to release the page on the fail path, then the page need not be cleaned up in khugepaged_prealloc_page anymore Signed-off-by: Xiao Guangrong <xiaoguangrong@xxxxxxxxxxxxxxxxxx> --- mm/huge_memory.c | 19 +++++++++++++++---- 1 files changed, 15 insertions(+), 4 deletions(-) diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 5622347..de0a028 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -1827,9 +1827,6 @@ static bool khugepaged_prealloc_page(struct page **hpage, bool *wait) *wait = false; *hpage = NULL; khugepaged_alloc_sleep(); - } else if (*hpage) { - put_page(*hpage); - *hpage = NULL; } return true; @@ -1863,6 +1860,13 @@ static struct page count_vm_event(THP_COLLAPSE_ALLOC); return *hpage; } + +static void khugepaged_cleanup_page(struct page **hpage) +{ + VM_BUG_ON(!*hpage); + put_page(*hpage); + *hpage = NULL; +} #else static struct page *khugepaged_alloc_hugepage(bool *wait) { @@ -1903,6 +1907,10 @@ static struct page VM_BUG_ON(!*hpage); return *hpage; } + +static void khugepaged_cleanup_page(struct page **hpage) +{ +} #endif static void collapse_huge_page(struct mm_struct *mm, @@ -1936,8 +1944,10 @@ static void collapse_huge_page(struct mm_struct *mm, if (!new_page) return; - if (unlikely(mem_cgroup_newpage_charge(new_page, mm, GFP_KERNEL))) + if (unlikely(mem_cgroup_newpage_charge(new_page, mm, GFP_KERNEL))) { + khugepaged_cleanup_page(hpage); return; + } /* * Prevent all access to pagetables with the exception of @@ -2048,6 +2058,7 @@ out_up_write: return; out: + khugepaged_cleanup_page(hpage); mem_cgroup_uncharge_page(new_page); goto out_up_write; } -- 1.7.7.6 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>