Merge git://git.kernel.org/pub/scm/linux/kernel/git/cmetcalf/linux-tile
[firefly-linux-kernel-4.4.55.git] / mm / mprotect.c
index 76824d73380da16f075f0a7ca80933d909d49613..44727811bf4cf62e3579261ee9699a37fab78b3d 100644 (file)
@@ -76,6 +76,22 @@ static unsigned long change_pte_range(struct vm_area_struct *vma, pmd_t *pmd,
                if (pte_present(oldpte)) {
                        pte_t ptent;
 
+                       /*
+                        * Avoid trapping faults against the zero or KSM
+                        * pages. See similar comment in change_huge_pmd.
+                        */
+                       if (prot_numa) {
+                               struct page *page;
+
+                               page = vm_normal_page(vma, addr, oldpte);
+                               if (!page || PageKsm(page))
+                                       continue;
+
+                               /* Avoid TLB flush if possible */
+                               if (pte_protnone(oldpte))
+                                       continue;
+                       }
+
                        ptent = ptep_modify_prot_start(mm, addr, pte);
                        ptent = pte_modify(ptent, newprot);
 
@@ -142,7 +158,7 @@ static inline unsigned long change_pmd_range(struct vm_area_struct *vma,
                                split_huge_page_pmd(vma, addr, pmd);
                        else {
                                int nr_ptes = change_huge_pmd(vma, pmd, addr,
-                                               newprot);
+                                               newprot, prot_numa);
 
                                if (nr_ptes) {
                                        if (nr_ptes == HPAGE_PMD_NR) {