]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/blobdiff - mm/madvise.c
asm-generic/tlb, arch: Provide CONFIG_HAVE_MMU_GATHER_PAGE_SIZE
[mirror_ubuntu-focal-kernel.git] / mm / madvise.c
index 6cb1ca93e290743144567bb64ae3c87894aa1f5d..bb3a4554d5d56f810f92064b268e8f0e097a9d6b 100644 (file)
@@ -328,7 +328,7 @@ static int madvise_free_pte_range(pmd_t *pmd, unsigned long addr,
        if (pmd_trans_unstable(pmd))
                return 0;
 
-       tlb_remove_check_page_size_change(tlb, PAGE_SIZE);
+       tlb_change_page_size(tlb, PAGE_SIZE);
        orig_pte = pte = pte_offset_map_lock(mm, pmd, addr, &ptl);
        flush_tlb_batched_pending(mm);
        arch_enter_lazy_mmu_mode();
@@ -458,29 +458,30 @@ static void madvise_free_page_range(struct mmu_gather *tlb,
 static int madvise_free_single_vma(struct vm_area_struct *vma,
                        unsigned long start_addr, unsigned long end_addr)
 {
-       unsigned long start, end;
        struct mm_struct *mm = vma->vm_mm;
+       struct mmu_notifier_range range;
        struct mmu_gather tlb;
 
        /* MADV_FREE works for only anon vma at the moment */
        if (!vma_is_anonymous(vma))
                return -EINVAL;
 
-       start = max(vma->vm_start, start_addr);
-       if (start >= vma->vm_end)
+       range.start = max(vma->vm_start, start_addr);
+       if (range.start >= vma->vm_end)
                return -EINVAL;
-       end = min(vma->vm_end, end_addr);
-       if (end <= vma->vm_start)
+       range.end = min(vma->vm_end, end_addr);
+       if (range.end <= vma->vm_start)
                return -EINVAL;
+       mmu_notifier_range_init(&range, mm, range.start, range.end);
 
        lru_add_drain();
-       tlb_gather_mmu(&tlb, mm, start, end);
+       tlb_gather_mmu(&tlb, mm, range.start, range.end);
        update_hiwater_rss(mm);
 
-       mmu_notifier_invalidate_range_start(mm, start, end);
-       madvise_free_page_range(&tlb, vma, start, end);
-       mmu_notifier_invalidate_range_end(mm, start, end);
-       tlb_finish_mmu(&tlb, start, end);
+       mmu_notifier_invalidate_range_start(&range);
+       madvise_free_page_range(&tlb, vma, range.start, range.end);
+       mmu_notifier_invalidate_range_end(&range);
+       tlb_finish_mmu(&tlb, range.start, range.end);
 
        return 0;
 }