diff --git a/mm/memory.c b/mm/memory.c index 6c264d2f969c..8ec0b01a05eb 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -4332,19 +4332,23 @@ void set_pte_range(struct vm_fault *vmf, struct folio *folio, bool write = vmf->flags & FAULT_FLAG_WRITE; bool prefault = in_range(vmf->address, addr, nr * PAGE_SIZE); pte_t entry; + struct page *p = page; - flush_icache_pages(vma, page, nr); - entry = mk_pte(page, vma->vm_page_prot); + flush_icache_pages(vma, p, nr); + do { + entry = mk_pte(p, vma->vm_page_prot); - if (prefault && arch_wants_old_prefaulted_pte()) - entry = pte_mkold(entry); - else - entry = pte_sw_mkyoung(entry); + if (prefault && arch_wants_old_prefaulted_pte()) + entry = pte_mkold(entry); + else + entry = pte_sw_mkyoung(entry); - if (write) - entry = maybe_mkwrite(pte_mkdirty(entry), vma); - if (unlikely(uffd_wp)) - entry = pte_mkuffd_wp(entry); + if (write) + entry = maybe_mkwrite(pte_mkdirty(entry), vma); + if (unlikely(uffd_wp)) + entry = pte_mkuffd_wp(entry); + p++; + }while(nr--); /* copy-on-write page */ if (write && !(vma->vm_flags & VM_SHARED)) { add_mm_counter(vma->vm_mm, MM_ANONPAGES, nr);