|
@@ -1355,9 +1355,8 @@ int do_huge_pmd_numa_page(struct mm_struct *mm, struct vm_area_struct *vma,
|
|
|
goto out;
|
|
|
clear_pmdnuma:
|
|
|
BUG_ON(!PageLocked(page));
|
|
|
- pmd = pmd_mknonnuma(pmd);
|
|
|
+ pmd = pmd_modify(pmd, vma->vm_page_prot);
|
|
|
set_pmd_at(mm, haddr, pmdp, pmd);
|
|
|
- VM_BUG_ON(pmd_protnone(*pmdp));
|
|
|
update_mmu_cache_pmd(vma, addr, pmdp);
|
|
|
unlock_page(page);
|
|
|
out_unlock:
|
|
@@ -1472,7 +1471,7 @@ out:
|
|
|
* - HPAGE_PMD_NR is protections changed and TLB flush necessary
|
|
|
*/
|
|
|
int change_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd,
|
|
|
- unsigned long addr, pgprot_t newprot, int prot_numa)
|
|
|
+ unsigned long addr, pgprot_t newprot)
|
|
|
{
|
|
|
struct mm_struct *mm = vma->vm_mm;
|
|
|
spinlock_t *ptl;
|
|
@@ -1481,29 +1480,11 @@ int change_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd,
|
|
|
if (__pmd_trans_huge_lock(pmd, vma, &ptl) == 1) {
|
|
|
pmd_t entry;
|
|
|
ret = 1;
|
|
|
- if (!prot_numa) {
|
|
|
- entry = pmdp_get_and_clear_notify(mm, addr, pmd);
|
|
|
- if (pmd_protnone(entry))
|
|
|
- entry = pmd_mknonnuma(entry);
|
|
|
- entry = pmd_modify(entry, newprot);
|
|
|
- ret = HPAGE_PMD_NR;
|
|
|
- set_pmd_at(mm, addr, pmd, entry);
|
|
|
- BUG_ON(pmd_write(entry));
|
|
|
- } else {
|
|
|
- struct page *page = pmd_page(*pmd);
|
|
|
-
|
|
|
- /*
|
|
|
- * Do not trap faults against the zero page. The
|
|
|
- * read-only data is likely to be read-cached on the
|
|
|
- * local CPU cache and it is less useful to know about
|
|
|
- * local vs remote hits on the zero page.
|
|
|
- */
|
|
|
- if (!is_huge_zero_page(page) &&
|
|
|
- !pmd_protnone(*pmd)) {
|
|
|
- pmdp_set_numa(mm, addr, pmd);
|
|
|
- ret = HPAGE_PMD_NR;
|
|
|
- }
|
|
|
- }
|
|
|
+ entry = pmdp_get_and_clear_notify(mm, addr, pmd);
|
|
|
+ entry = pmd_modify(entry, newprot);
|
|
|
+ ret = HPAGE_PMD_NR;
|
|
|
+ set_pmd_at(mm, addr, pmd, entry);
|
|
|
+ BUG_ON(pmd_write(entry));
|
|
|
spin_unlock(ptl);
|
|
|
}
|
|
|
|