Revert "mm: prepare for FAULT_FLAG_SPECULATIVE"

This reverts commit f447ae0acd.

Bug: 128240262
Change-Id: I362db97f606279ce66add0b6c3726438e80a597f
Signed-off-by: Minchan Kim <minchan@google.com>
[dereference23: Forward port to msm-5.4]
Signed-off-by: Alexander Winkowski <dereference23@outlook.com>
This commit is contained in:
Minchan Kim 2019-03-11 11:42:56 +09:00 • committed by Alexander Winkowski
commit 98a98411f7
No known key found for this signature in database
GPG key ID: 72762A66704CDE44

View file

@ -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;
}