From 98a98411f7276f2f87f5f42fd2048cdd62a95507 Mon Sep 17 00:00:00 2001 From: Minchan Kim Date: Mon, 11 Mar 2019 11:42:56 +0900 Subject: [PATCH] Revert "mm: prepare for FAULT_FLAG_SPECULATIVE" This reverts commit f447ae0acd3901bc5bec183c1b66f10b8bfeff91. Bug: 128240262 Change-Id: I362db97f606279ce66add0b6c3726438e80a597f Signed-off-by: Minchan Kim [dereference23: Forward port to msm-5.4] Signed-off-by: Alexander Winkowski --- mm/memory.c | 81 ++++++++++++++++++----------------------------------- 1 file changed, 27 insertions(+), 54 deletions(-) diff --git a/mm/memory.c b/mm/memory.c index 9a091ca4aa0f..0b0c4489d9a1 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -2208,13 +2208,6 @@ int apply_to_page_range(struct mm_struct *mm, unsigned long addr, } EXPORT_SYMBOL_GPL(apply_to_page_range); -static inline bool pte_map_lock(struct vm_fault *vmf) -{ - vmf->pte = pte_offset_map_lock(vmf->vma->vm_mm, vmf->pmd, - vmf->address, &vmf->ptl); - return true; -} - /* * handle_pte_fault chooses page fault handler according to an entry which was * read non-atomically. Before making any commitment, on those architectures @@ -2491,21 +2484,20 @@ static vm_fault_t wp_page_copy(struct vm_fault *vmf) int page_copied = 0; struct mem_cgroup *memcg; struct mmu_notifier_range range; - int ret = VM_FAULT_OOM; if (unlikely(anon_vma_prepare(vma))) - goto out; + goto oom; if (is_zero_pfn(pte_pfn(vmf->orig_pte))) { new_page = alloc_zeroed_user_highpage_movable(vma, vmf->address); if (!new_page) - goto out; + goto oom; } else { new_page = alloc_page_vma(GFP_HIGHUSER_MOVABLE, vma, vmf->address); if (!new_page) - goto out; + goto oom; if (!cow_user_page(new_page, old_page, vmf)) { /* @@ -2522,7 +2514,7 @@ static vm_fault_t wp_page_copy(struct vm_fault *vmf) } if (mem_cgroup_try_charge_delay(new_page, mm, GFP_KERNEL, &memcg, false)) - goto out_free_new; + goto oom_free_new; __SetPageUptodate(new_page); @@ -2534,10 +2526,7 @@ static vm_fault_t wp_page_copy(struct vm_fault *vmf) /* * Re-check the pte - we dropped the lock */ - if (!pte_map_lock(vmf)) { - ret = VM_FAULT_RETRY; - goto out_uncharge; - } + vmf->pte = pte_offset_map_lock(mm, vmf->pmd, vmf->address, &vmf->ptl); if (likely(pte_same(*vmf->pte, vmf->orig_pte))) { if (old_page) { if (!PageAnon(old_page)) { @@ -2624,14 +2613,12 @@ static vm_fault_t wp_page_copy(struct vm_fault *vmf) put_page(old_page); } return page_copied ? VM_FAULT_WRITE : 0; -out_uncharge: - mem_cgroup_cancel_charge(new_page, memcg, false); -out_free_new: +oom_free_new: put_page(new_page); -out: +oom: if (old_page) put_page(old_page); - return ret; + return VM_FAULT_OOM; } /** @@ -2653,8 +2640,8 @@ out: vm_fault_t finish_mkwrite_fault(struct vm_fault *vmf) { WARN_ON_ONCE(!(vmf->vma->vm_flags & VM_SHARED)); - if (!pte_map_lock(vmf)) - return VM_FAULT_RETRY; + vmf->pte = pte_offset_map_lock(vmf->vma->vm_mm, vmf->pmd, vmf->address, + &vmf->ptl); /* * We might have raced with another page fault while we released the * pte_offset_map_lock. @@ -3003,16 +2990,11 @@ vm_fault_t do_swap_page(struct vm_fault *vmf) if (!page) { /* - * Back out if the VMA has changed in our back during - * a speculative page fault or if somebody else - * faulted in this pte while we released the pte lock. + * Back out if somebody else faulted in this pte + * while we released the pte lock. */ - if (!pte_map_lock(vmf)) { - delayacct_clear_flag(DELAYACCT_PF_SWAPIN); - ret = VM_FAULT_RETRY; - goto out; - } - + vmf->pte = pte_offset_map_lock(vma->vm_mm, vmf->pmd, + vmf->address, &vmf->ptl); if (likely(pte_same(*vmf->pte, vmf->orig_pte))) ret = VM_FAULT_OOM; delayacct_clear_flag(DELAYACCT_PF_SWAPIN); @@ -3065,13 +3047,10 @@ vm_fault_t do_swap_page(struct vm_fault *vmf) } /* - * Back out if the VMA has changed in our back during a speculative - * page fault or if somebody else already faulted in this pte. + * Back out if somebody else already faulted in this pte. */ - if (!pte_map_lock(vmf)) { - ret = VM_FAULT_RETRY; - goto out_cancel_cgroup; - } + vmf->pte = pte_offset_map_lock(vma->vm_mm, vmf->pmd, vmf->address, + &vmf->ptl); if (unlikely(!pte_same(*vmf->pte, vmf->orig_pte))) goto out_nomap; @@ -3149,9 +3128,8 @@ unlock: out: return ret; out_nomap: - pte_unmap_unlock(vmf->pte, vmf->ptl); -out_cancel_cgroup: mem_cgroup_cancel_charge(page, memcg, false); + pte_unmap_unlock(vmf->pte, vmf->ptl); out_page: unlock_page(page); out_release: @@ -3202,8 +3180,8 @@ static vm_fault_t do_anonymous_page(struct vm_fault *vmf) !mm_forbids_zeropage(vma->vm_mm)) { entry = pte_mkspecial(pfn_pte(my_zero_pfn(vmf->address), vma->vm_page_prot)); - if (!pte_map_lock(vmf)) - return VM_FAULT_RETRY; + vmf->pte = pte_offset_map_lock(vma->vm_mm, vmf->pmd, + vmf->address, &vmf->ptl); if (!pte_none(*vmf->pte)) goto unlock; ret = check_stable_address_space(vma->vm_mm); @@ -3239,16 +3217,14 @@ static vm_fault_t do_anonymous_page(struct vm_fault *vmf) if (vma->vm_flags & VM_WRITE) entry = pte_mkwrite(pte_mkdirty(entry)); - if (!pte_map_lock(vmf)) { - ret = VM_FAULT_RETRY; - goto release; - } + vmf->pte = pte_offset_map_lock(vma->vm_mm, vmf->pmd, vmf->address, + &vmf->ptl); if (!pte_none(*vmf->pte)) - goto unlock_and_release; + goto release; ret = check_stable_address_space(vma->vm_mm); if (ret) - goto unlock_and_release; + goto release; /* Deliver the page fault to userland, check inside PT lock */ if (userfaultfd_missing(vma)) { @@ -3270,12 +3246,10 @@ setpte: unlock: pte_unmap_unlock(vmf->pte, vmf->ptl); return ret; -unlock_and_release: - pte_unmap_unlock(vmf->pte, vmf->ptl); release: mem_cgroup_cancel_charge(page, memcg, false); put_page(page); - return ret; + goto unlock; oom_free_page: put_page(page); oom: @@ -3399,9 +3373,8 @@ map_pte: * pte_none() under vmf->ptl protection when we return to * alloc_set_pte(). */ - if (!pte_map_lock(vmf)) - return VM_FAULT_RETRY; - + vmf->pte = pte_offset_map_lock(vma->vm_mm, vmf->pmd, vmf->address, + &vmf->ptl); return 0; }