Messages in this thread Patch in this message | | | Date | Wed, 12 Sep 2012 20:57:23 +0800 | From | Xiao Guangrong <> | Subject | [PATCH 3/3] thp: introduce khugepaged_cleanup_page |
| |
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@linux.vnet.ibm.com> --- 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
| |