|
@@ -158,6 +158,19 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addres
|
|
|
#define lazy_mmu_prot_update(pte) do { } while (0)
|
|
|
#endif
|
|
|
|
|
|
+#ifndef __HAVE_ARCH_MULTIPLE_ZERO_PAGE
|
|
|
+#define move_pte(pte, prot, old_addr, new_addr) (pte)
|
|
|
+#else
|
|
|
+#define move_pte(pte, prot, old_addr, new_addr) \
|
|
|
+({ \
|
|
|
+ pte_t newpte = (pte); \
|
|
|
+ if (pte_present(pte) && pfn_valid(pte_pfn(pte)) && \
|
|
|
+ pte_page(pte) == ZERO_PAGE(old_addr)) \
|
|
|
+ newpte = mk_pte(ZERO_PAGE(new_addr), (prot)); \
|
|
|
+ newpte; \
|
|
|
+})
|
|
|
+#endif
|
|
|
+
|
|
|
/*
|
|
|
* When walking page tables, get the address of the next boundary,
|
|
|
* or the end address of the range if that comes earlier. Although no
|