diff options
Diffstat (limited to 'mm/mmu_notifier.c')
-rw-r--r-- | mm/mmu_notifier.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/mm/mmu_notifier.c b/mm/mmu_notifier.c index 5f4ef0250bee..7e33f2cb3c77 100644 --- a/mm/mmu_notifier.c +++ b/mm/mmu_notifier.c | |||
@@ -99,6 +99,26 @@ int __mmu_notifier_clear_flush_young(struct mm_struct *mm, | |||
99 | return young; | 99 | return young; |
100 | } | 100 | } |
101 | 101 | ||
102 | void __mmu_notifier_change_pte(struct mm_struct *mm, unsigned long address, | ||
103 | pte_t pte) | ||
104 | { | ||
105 | struct mmu_notifier *mn; | ||
106 | struct hlist_node *n; | ||
107 | |||
108 | rcu_read_lock(); | ||
109 | hlist_for_each_entry_rcu(mn, n, &mm->mmu_notifier_mm->list, hlist) { | ||
110 | if (mn->ops->change_pte) | ||
111 | mn->ops->change_pte(mn, mm, address, pte); | ||
112 | /* | ||
113 | * Some drivers don't have change_pte, | ||
114 | * so we must call invalidate_page in that case. | ||
115 | */ | ||
116 | else if (mn->ops->invalidate_page) | ||
117 | mn->ops->invalidate_page(mn, mm, address); | ||
118 | } | ||
119 | rcu_read_unlock(); | ||
120 | } | ||
121 | |||
102 | void __mmu_notifier_invalidate_page(struct mm_struct *mm, | 122 | void __mmu_notifier_invalidate_page(struct mm_struct *mm, |
103 | unsigned long address) | 123 | unsigned long address) |
104 | { | 124 | { |