|
@@ -311,14 +311,24 @@ static inline void mmu_notifier_mm_destroy(struct mm_struct *mm)
|
|
|
__young; \
|
|
|
})
|
|
|
|
|
|
+/*
|
|
|
+ * set_pte_at_notify() sets the pte _after_ running the notifier.
|
|
|
+ * This is safe to start by updating the secondary MMUs, because the primary MMU
|
|
|
+ * pte invalidate must have already happened with a ptep_clear_flush() before
|
|
|
+ * set_pte_at_notify() has been invoked. Updating the secondary MMUs first is
|
|
|
+ * required when we change both the protection of the mapping from read-only to
|
|
|
+ * read-write and the pfn (like during copy on write page faults). Otherwise the
|
|
|
+ * old page would remain mapped readonly in the secondary MMUs after the new
|
|
|
+ * page is already writable by some CPU through the primary MMU.
|
|
|
+ */
|
|
|
#define set_pte_at_notify(__mm, __address, __ptep, __pte) \
|
|
|
({ \
|
|
|
struct mm_struct *___mm = __mm; \
|
|
|
unsigned long ___address = __address; \
|
|
|
pte_t ___pte = __pte; \
|
|
|
\
|
|
|
- set_pte_at(___mm, ___address, __ptep, ___pte); \
|
|
|
mmu_notifier_change_pte(___mm, ___address, ___pte); \
|
|
|
+ set_pte_at(___mm, ___address, __ptep, ___pte); \
|
|
|
})
|
|
|
|
|
|
#else /* CONFIG_MMU_NOTIFIER */
|