mm/huge_memory.c | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/mm/huge_memory.c b/mm/huge_memory.c index e5483347291c..9f52389eb031 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -1304,25 +1304,11 @@ vm_fault_t do_huge_pmd_wp_page(struct vm_fault *vmf) VM_BUG_ON_PAGE(!PageHead(page), page); /* Lock page for reuse_swap_page() */ - if (!trylock_page(page)) { - get_page(page); - spin_unlock(vmf->ptl); - lock_page(page); - spin_lock(vmf->ptl); - if (unlikely(!pmd_same(*vmf->pmd, orig_pmd))) { - spin_unlock(vmf->ptl); - unlock_page(page); - put_page(page); - return 0; - } - put_page(page); - } + if (!trylock_page(page)) + goto failed_to_lock; - /* - * We can only reuse the page if nobody else maps the huge page or it's - * part. - */ - if (reuse_swap_page(page, NULL)) { + /* Reuse the page as-is if this pmd entry is the only user */ + if (page_count(page) == 1) { pmd_t entry; entry = pmd_mkyoung(orig_pmd); entry = maybe_pmd_mkwrite(pmd_mkdirty(entry), vma); @@ -1334,6 +1320,7 @@ vm_fault_t do_huge_pmd_wp_page(struct vm_fault *vmf) } unlock_page(page); +failed_to_lock: spin_unlock(vmf->ptl); fallback: __split_huge_pmd(vma, vmf->pmd, vmf->address, false, NULL);