In change_pte_range(), when a PTE is changed for prot_numa, _PAGE_RW is
preserved to avoid the additional write fault after the NUMA hinting fault.
However, pte_write() now includes both normal writable and shadow stack
(RW=0, Dirty=1) PTEs, but the latter does not have _PAGE_RW and has no need
to preserve it.

Exclude shadow stack from preserve_write test, and apply the same change to
change_huge_pmd().

Signed-off-by: Yu-cheng Yu <yu-cheng...@intel.com>
Cc: Kirill A. Shutemov <kirill.shute...@linux.intel.com>
---
v25:
- Move is_shadow_stack_mapping() to a separate line.
v24:
- Change arch_shadow_stack_mapping() to is_shadow_stack_mapping().

 mm/huge_memory.c | 7 +++++++
 mm/mprotect.c    | 7 +++++++
 2 files changed, 14 insertions(+)

diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index a0858eac0320..9e51cae35aad 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -1824,6 +1824,13 @@ int change_huge_pmd(struct vm_area_struct *vma, pmd_t 
*pmd,
                return 0;
 
        preserve_write = prot_numa && pmd_write(*pmd);
+
+       /*
+        * Preserve only normal writable huge PMD, but not shadow
+        * stack (RW=0, Dirty=1).
+        */
+       if (is_shadow_stack_mapping(vma->vm_flags))
+               preserve_write = false;
        ret = 1;
 
 #ifdef CONFIG_ARCH_ENABLE_THP_MIGRATION
diff --git a/mm/mprotect.c b/mm/mprotect.c
index c1ce78d688b6..3b2f0d75519f 100644
--- a/mm/mprotect.c
+++ b/mm/mprotect.c
@@ -77,6 +77,13 @@ static unsigned long change_pte_range(struct vm_area_struct 
*vma, pmd_t *pmd,
                        pte_t ptent;
                        bool preserve_write = prot_numa && pte_write(oldpte);
 
+                       /*
+                        * Preserve only normal writable PTE, but not shadow
+                        * stack (RW=0, Dirty=1).
+                        */
+                       if (is_shadow_stack_mapping(vma->vm_flags))
+                               preserve_write = false;
+
                        /*
                         * Avoid trapping faults against the zero or KSM
                         * pages. See similar comment in change_huge_pmd.
-- 
2.21.0

Reply via email to