]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
mm/memory: Fix free_pgtables loops and such
authorLiam R. Howlett <Liam.Howlett@Oracle.com>
Tue, 22 Dec 2020 01:59:45 +0000 (20:59 -0500)
committerLiam R. Howlett <Liam.Howlett@Oracle.com>
Tue, 5 Jan 2021 17:33:41 +0000 (12:33 -0500)
Signed-off-by: Liam R. Howlett <Liam.Howlett@Oracle.com>
mm/memory.c

index 2bf7b6291f13b1dfa2b79bd27c19ed2624af82b4..3217c46fa32b851f349024448ff949035b116b0b 100644 (file)
@@ -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);
 }