aboutsummaryrefslogtreecommitdiffstats
path: root/mm/memory.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/memory.c')
-rw-r--r--mm/memory.c12
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