|
@@ -58,6 +58,13 @@ static unsigned long change_pte_range(struct vm_area_struct *vma, pmd_t *pmd,
|
|
|
if (pte_numa(ptent))
|
|
|
ptent = pte_mknonnuma(ptent);
|
|
|
ptent = pte_modify(ptent, newprot);
|
|
|
+ /*
|
|
|
+ * Avoid taking write faults for pages we
|
|
|
+ * know to be dirty.
|
|
|
+ */
|
|
|
+ if (dirty_accountable && pte_dirty(ptent))
|
|
|
+ ptent = pte_mkwrite(ptent);
|
|
|
+ ptep_modify_prot_commit(mm, addr, pte, ptent);
|
|
|
updated = true;
|
|
|
} else {
|
|
|
struct page *page;
|
|
@@ -72,22 +79,8 @@ static unsigned long change_pte_range(struct vm_area_struct *vma, pmd_t *pmd,
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- /*
|
|
|
- * Avoid taking write faults for pages we know to be
|
|
|
- * dirty.
|
|
|
- */
|
|
|
- if (dirty_accountable && pte_dirty(ptent)) {
|
|
|
- ptent = pte_mkwrite(ptent);
|
|
|
- updated = true;
|
|
|
- }
|
|
|
-
|
|
|
if (updated)
|
|
|
pages++;
|
|
|
-
|
|
|
- /* Only !prot_numa always clears the pte */
|
|
|
- if (!prot_numa)
|
|
|
- ptep_modify_prot_commit(mm, addr, pte, ptent);
|
|
|
} else if (IS_ENABLED(CONFIG_MIGRATION) && !pte_file(oldpte)) {
|
|
|
swp_entry_t entry = pte_to_swp_entry(oldpte);
|
|
|
|