@@ -3635,9 +3635,6 @@ vm_fault_t do_swap_page(struct vm_fault *vmf)
pte = pte_mkuffd_wp(pte);
pte = pte_wrprotect(pte);
}
- set_pte_at(vma->vm_mm, vmf->address, vmf->pte, pte);
- arch_do_swap_page(vma->vm_mm, vma, vmf->address, pte, vmf->orig_pte);
- vmf->orig_pte = pte;
/* ksm created a completely new copy */
if (unlikely(page != swapcache && swapcache)) {
@@ -3647,6 +3644,10 @@ vm_fault_t do_swap_page(struct vm_fault *vmf)
do_page_add_anon_rmap(page, vma, vmf->address, exclusive);
}
+ set_pte_at(vma->vm_mm, vmf->address, vmf->pte, pte);
+ arch_do_swap_page(vma->vm_mm, vma, vmf->address, pte, vmf->orig_pte);
+ vmf->orig_pte = pte;
+
swap_free(entry);
if (mem_cgroup_swap_full(page) ||
(vma->vm_flags & VM_LOCKED) || PageMlocked(page))
In do_swap_page() we first insert the entry into user page table, and later change the struct page to indicate that this is anonymous page. In all other places we first configure the page metadata and then insert entries into the page table. While odd, the behaviour is benign. Page table check, however, will use the information from struct page to verify the type of entry is inserted. Change the order in do_swap_page() to first update struct page, and later insert pte entry into the page table. Signed-off-by: Pasha Tatashin <pasha.tatashin@soleen.com> --- mm/memory.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)