diff options
Diffstat (limited to 'mm/mremap.c')
-rw-r--r-- | mm/mremap.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/mm/mremap.c b/mm/mremap.c index 3b639a4b26b..1b61c2d3307 100644 --- a/mm/mremap.c +++ b/mm/mremap.c | |||
@@ -149,11 +149,15 @@ unsigned long move_page_tables(struct vm_area_struct *vma, | |||
149 | unsigned long extent, next, old_end; | 149 | unsigned long extent, next, old_end; |
150 | pmd_t *old_pmd, *new_pmd; | 150 | pmd_t *old_pmd, *new_pmd; |
151 | bool need_flush = false; | 151 | bool need_flush = false; |
152 | unsigned long mmun_start; /* For mmu_notifiers */ | ||
153 | unsigned long mmun_end; /* For mmu_notifiers */ | ||
152 | 154 | ||
153 | old_end = old_addr + len; | 155 | old_end = old_addr + len; |
154 | flush_cache_range(vma, old_addr, old_end); | 156 | flush_cache_range(vma, old_addr, old_end); |
155 | 157 | ||
156 | mmu_notifier_invalidate_range_start(vma->vm_mm, old_addr, old_end); | 158 | mmun_start = old_addr; |
159 | mmun_end = old_end; | ||
160 | mmu_notifier_invalidate_range_start(vma->vm_mm, mmun_start, mmun_end); | ||
157 | 161 | ||
158 | for (; old_addr < old_end; old_addr += extent, new_addr += extent) { | 162 | for (; old_addr < old_end; old_addr += extent, new_addr += extent) { |
159 | cond_resched(); | 163 | cond_resched(); |
@@ -197,7 +201,7 @@ unsigned long move_page_tables(struct vm_area_struct *vma, | |||
197 | if (likely(need_flush)) | 201 | if (likely(need_flush)) |
198 | flush_tlb_range(vma, old_end-len, old_addr); | 202 | flush_tlb_range(vma, old_end-len, old_addr); |
199 | 203 | ||
200 | mmu_notifier_invalidate_range_end(vma->vm_mm, old_end-len, old_end); | 204 | mmu_notifier_invalidate_range_end(vma->vm_mm, mmun_start, mmun_end); |
201 | 205 | ||
202 | return len + old_addr - old_end; /* how much done */ | 206 | return len + old_addr - old_end; /* how much done */ |
203 | } | 207 | } |