|
@@ -3400,32 +3400,32 @@ static int do_numa_page(struct vm_fault *vmf)
|
|
|
int last_cpupid;
|
|
|
int target_nid;
|
|
|
bool migrated = false;
|
|
|
- pte_t pte = vmf->orig_pte;
|
|
|
- bool was_writable = pte_write(pte);
|
|
|
+ pte_t pte;
|
|
|
+ bool was_writable = pte_write(vmf->orig_pte);
|
|
|
int flags = 0;
|
|
|
|
|
|
/*
|
|
|
* The "pte" at this point cannot be used safely without
|
|
|
* validation through pte_unmap_same(). It's of NUMA type but
|
|
|
* the pfn may be screwed if the read is non atomic.
|
|
|
- *
|
|
|
- * We can safely just do a "set_pte_at()", because the old
|
|
|
- * page table entry is not accessible, so there would be no
|
|
|
- * concurrent hardware modifications to the PTE.
|
|
|
*/
|
|
|
vmf->ptl = pte_lockptr(vma->vm_mm, vmf->pmd);
|
|
|
spin_lock(vmf->ptl);
|
|
|
- if (unlikely(!pte_same(*vmf->pte, pte))) {
|
|
|
+ if (unlikely(!pte_same(*vmf->pte, vmf->orig_pte))) {
|
|
|
pte_unmap_unlock(vmf->pte, vmf->ptl);
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- /* Make it present again */
|
|
|
+ /*
|
|
|
+ * Make it present again, Depending on how arch implementes non
|
|
|
+ * accessible ptes, some can allow access by kernel mode.
|
|
|
+ */
|
|
|
+ pte = ptep_modify_prot_start(vma->vm_mm, vmf->address, vmf->pte);
|
|
|
pte = pte_modify(pte, vma->vm_page_prot);
|
|
|
pte = pte_mkyoung(pte);
|
|
|
if (was_writable)
|
|
|
pte = pte_mkwrite(pte);
|
|
|
- set_pte_at(vma->vm_mm, vmf->address, vmf->pte, pte);
|
|
|
+ ptep_modify_prot_commit(vma->vm_mm, vmf->address, vmf->pte, pte);
|
|
|
update_mmu_cache(vma, vmf->address, vmf->pte);
|
|
|
|
|
|
page = vm_normal_page(vma, vmf->address, pte);
|