mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 19:08:57 +09:00
FROMLIST: mm: introduce pte_spinlock for FAULT_FLAG_SPECULATIVE
When handling page fault without holding the mmap_sem the fetch of the pte lock pointer and the locking will have to be done while ensuring that the VMA is not touched in our back. So move the fetch and locking operations in a dedicated function. Change-Id: If93ab95b1d22b7195e1c15b57315021f6be7c394 Signed-off-by: Laurent Dufour <ldufour@linux.vnet.ibm.com> Link: https://lore.kernel.org/lkml/1523975611-15978-6-git-send-email-ldufour@linux.vnet.ibm.com/ Bug: 161210518 Signed-off-by: Vinayak Menon <vinmenon@codeaurora.org>
This commit is contained in:
committed by
Suren Baghdasaryan
parent
afeec97a8d
commit
b23ffc113b
15
mm/memory.c
15
mm/memory.c
@@ -2560,6 +2560,13 @@ int apply_to_page_range(struct mm_struct *mm, unsigned long addr,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(apply_to_page_range);
|
||||
|
||||
static inline bool pte_spinlock(struct vm_fault *vmf)
|
||||
{
|
||||
vmf->ptl = pte_lockptr(vmf->vma->vm_mm, vmf->pmd);
|
||||
spin_lock(vmf->ptl);
|
||||
return true;
|
||||
}
|
||||
|
||||
static inline bool pte_map_lock(struct vm_fault *vmf)
|
||||
{
|
||||
vmf->pte = pte_offset_map_lock(vmf->vma->vm_mm, vmf->pmd,
|
||||
@@ -4229,8 +4236,8 @@ static vm_fault_t do_numa_page(struct vm_fault *vmf)
|
||||
* validation through pte_unmap_same(). It's of NUMA type but
|
||||
* the pfn may be screwed if the read is non atomic.
|
||||
*/
|
||||
vmf->ptl = pte_lockptr(vma->vm_mm, vmf->pmd);
|
||||
spin_lock(vmf->ptl);
|
||||
if (!pte_spinlock(vmf))
|
||||
return VM_FAULT_RETRY;
|
||||
if (unlikely(!pte_same(*vmf->pte, vmf->orig_pte))) {
|
||||
pte_unmap_unlock(vmf->pte, vmf->ptl);
|
||||
goto out;
|
||||
@@ -4432,8 +4439,8 @@ static vm_fault_t handle_pte_fault(struct vm_fault *vmf)
|
||||
if (pte_protnone(vmf->orig_pte) && vma_is_accessible(vmf->vma))
|
||||
return do_numa_page(vmf);
|
||||
|
||||
vmf->ptl = pte_lockptr(vmf->vma->vm_mm, vmf->pmd);
|
||||
spin_lock(vmf->ptl);
|
||||
if (!pte_spinlock(vmf))
|
||||
return VM_FAULT_RETRY;
|
||||
entry = vmf->orig_pte;
|
||||
if (unlikely(!pte_same(*vmf->pte, entry))) {
|
||||
update_mmu_tlb(vmf->vma, vmf->address, vmf->pte);
|
||||
|
||||
Reference in New Issue
Block a user