From: Liam R. Howlett Date: Tue, 22 Dec 2020 01:59:45 +0000 (-0500) Subject: mm/memory: Fix free_pgtables loops and such X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=0643e5dc22aa50025e1c9d5e0d8523adbc8cab3c;p=users%2Fjedix%2Flinux-maple.git mm/memory: Fix free_pgtables loops and such Signed-off-by: Liam R. Howlett --- diff --git a/mm/memory.c b/mm/memory.c index 2bf7b6291f13..3217c46fa32b 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -395,9 +395,10 @@ void free_pgtables(struct mmu_gather *tlb, struct ma_state *mas, do { unsigned long addr = vma->vm_start; - next = mas_find(&ma_next, ceiling - 1); - + next = mas_find(&ma_next, ceiling - 1); + BUG_ON(vma->vm_start < floor); + BUG_ON(vma->vm_end - 1 > ceiling - 1); /* * Hide vma from rmap and truncate_pagecache before freeing * pgtables @@ -416,6 +417,8 @@ void free_pgtables(struct mmu_gather *tlb, struct ma_state *mas, && !is_vm_hugetlb_page(next)) { next = mas_find(&ma_next, ceiling - 1); vma = mas_find(mas, ceiling - 1); + BUG_ON(vma->vm_start < floor); + BUG_ON(vma->vm_end -1 > ceiling - 1); unlink_anon_vmas(vma); unlink_file_vma(vma); } @@ -1505,6 +1508,8 @@ void unmap_vmas(struct mmu_gather *tlb, start_addr, end_addr); mmu_notifier_invalidate_range_start(&range); do { + BUG_ON(vma->vm_start < start_addr); + BUG_ON(vma->vm_end > end_addr); unmap_single_vma(tlb, vma, start_addr, end_addr, NULL); } while ((vma = mas_find(mas, end_addr - 1)) != NULL); mmu_notifier_invalidate_range_end(&range); @@ -1531,8 +1536,9 @@ void zap_page_range(struct vm_area_struct *vma, unsigned long start, tlb_gather_mmu(&tlb, vma->vm_mm, start, range.end); update_hiwater_rss(vma->vm_mm); mmu_notifier_invalidate_range_start(&range); - mas_for_each(&mas, vma, range.end - 1) + do { unmap_single_vma(&tlb, vma, start, range.end, NULL); + } while ((vma = mas_find(&mas, range.end - 1)) != NULL); mmu_notifier_invalidate_range_end(&range); tlb_finish_mmu(&tlb, start, range.end); }