|
@@ -52,17 +52,19 @@ static unsigned long change_pte_range(struct vm_area_struct *vma, pmd_t *pmd,
|
|
pte_t ptent;
|
|
pte_t ptent;
|
|
bool updated = false;
|
|
bool updated = false;
|
|
|
|
|
|
- ptent = ptep_modify_prot_start(mm, addr, pte);
|
|
|
|
if (!prot_numa) {
|
|
if (!prot_numa) {
|
|
|
|
+ ptent = ptep_modify_prot_start(mm, addr, pte);
|
|
ptent = pte_modify(ptent, newprot);
|
|
ptent = pte_modify(ptent, newprot);
|
|
updated = true;
|
|
updated = true;
|
|
} else {
|
|
} else {
|
|
struct page *page;
|
|
struct page *page;
|
|
|
|
|
|
|
|
+ ptent = *pte;
|
|
page = vm_normal_page(vma, addr, oldpte);
|
|
page = vm_normal_page(vma, addr, oldpte);
|
|
if (page) {
|
|
if (page) {
|
|
if (!pte_numa(oldpte)) {
|
|
if (!pte_numa(oldpte)) {
|
|
ptent = pte_mknuma(ptent);
|
|
ptent = pte_mknuma(ptent);
|
|
|
|
+ set_pte_at(mm, addr, pte, ptent);
|
|
updated = true;
|
|
updated = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -79,7 +81,10 @@ static unsigned long change_pte_range(struct vm_area_struct *vma, pmd_t *pmd,
|
|
|
|
|
|
if (updated)
|
|
if (updated)
|
|
pages++;
|
|
pages++;
|
|
- ptep_modify_prot_commit(mm, addr, pte, ptent);
|
|
|
|
|
|
+
|
|
|
|
+ /* 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)) {
|
|
} else if (IS_ENABLED(CONFIG_MIGRATION) && !pte_file(oldpte)) {
|
|
swp_entry_t entry = pte_to_swp_entry(oldpte);
|
|
swp_entry_t entry = pte_to_swp_entry(oldpte);
|
|
|
|
|