|
@@ -1471,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)
|
|
|
+ unsigned long addr, pgprot_t newprot, int prot_numa)
|
|
|
{
|
|
|
struct mm_struct *mm = vma->vm_mm;
|
|
|
spinlock_t *ptl;
|
|
@@ -1479,6 +1479,17 @@ int change_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd,
|
|
|
|
|
|
if (__pmd_trans_huge_lock(pmd, vma, &ptl) == 1) {
|
|
|
pmd_t entry;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Avoid trapping faults against the zero page. The read-only
|
|
|
+ * data is likely to be read-cached on the local CPU and
|
|
|
+ * local/remote hits to the zero page are not interesting.
|
|
|
+ */
|
|
|
+ if (prot_numa && is_huge_zero_pmd(*pmd)) {
|
|
|
+ spin_unlock(ptl);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
ret = 1;
|
|
|
entry = pmdp_get_and_clear_notify(mm, addr, pmd);
|
|
|
entry = pmd_modify(entry, newprot);
|