diff options
Diffstat (limited to 'mm/memory.c')
-rw-r--r-- | mm/memory.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/mm/memory.c b/mm/memory.c index 24ba688876d6..4ea89a2e3a83 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
@@ -260,6 +260,12 @@ void free_pgtables(struct mmu_gather **tlb, struct vm_area_struct *vma, | |||
260 | struct vm_area_struct *next = vma->vm_next; | 260 | struct vm_area_struct *next = vma->vm_next; |
261 | unsigned long addr = vma->vm_start; | 261 | unsigned long addr = vma->vm_start; |
262 | 262 | ||
263 | /* | ||
264 | * Hide vma from rmap and vmtruncate before freeing pgtables | ||
265 | */ | ||
266 | anon_vma_unlink(vma); | ||
267 | unlink_file_vma(vma); | ||
268 | |||
263 | if (is_hugepage_only_range(vma->vm_mm, addr, HPAGE_SIZE)) { | 269 | if (is_hugepage_only_range(vma->vm_mm, addr, HPAGE_SIZE)) { |
264 | hugetlb_free_pgd_range(tlb, addr, vma->vm_end, | 270 | hugetlb_free_pgd_range(tlb, addr, vma->vm_end, |
265 | floor, next? next->vm_start: ceiling); | 271 | floor, next? next->vm_start: ceiling); |
@@ -272,6 +278,8 @@ void free_pgtables(struct mmu_gather **tlb, struct vm_area_struct *vma, | |||
272 | HPAGE_SIZE)) { | 278 | HPAGE_SIZE)) { |
273 | vma = next; | 279 | vma = next; |
274 | next = vma->vm_next; | 280 | next = vma->vm_next; |
281 | anon_vma_unlink(vma); | ||
282 | unlink_file_vma(vma); | ||
275 | } | 283 | } |
276 | free_pgd_range(tlb, addr, vma->vm_end, | 284 | free_pgd_range(tlb, addr, vma->vm_end, |
277 | floor, next? next->vm_start: ceiling); | 285 | floor, next? next->vm_start: ceiling); |
@@ -798,12 +806,12 @@ unsigned long zap_page_range(struct vm_area_struct *vma, unsigned long address, | |||
798 | } | 806 | } |
799 | 807 | ||
800 | lru_add_drain(); | 808 | lru_add_drain(); |
801 | spin_lock(&mm->page_table_lock); | ||
802 | tlb = tlb_gather_mmu(mm, 0); | 809 | tlb = tlb_gather_mmu(mm, 0); |
803 | update_hiwater_rss(mm); | 810 | update_hiwater_rss(mm); |
811 | spin_lock(&mm->page_table_lock); | ||
804 | end = unmap_vmas(&tlb, mm, vma, address, end, &nr_accounted, details); | 812 | end = unmap_vmas(&tlb, mm, vma, address, end, &nr_accounted, details); |
805 | tlb_finish_mmu(tlb, address, end); | ||
806 | spin_unlock(&mm->page_table_lock); | 813 | spin_unlock(&mm->page_table_lock); |
814 | tlb_finish_mmu(tlb, address, end); | ||
807 | return end; | 815 | return end; |
808 | } | 816 | } |
809 | 817 | ||