struct vm_area_struct *vma,
                             unsigned long addr, unsigned long end,
                             struct zap_details *details);
+void zap_page_range_single_batched(struct mmu_gather *tlb,
+               struct vm_area_struct *vma, unsigned long addr,
+               unsigned long size, struct zap_details *details);
 int folio_unmap_invalidate(struct address_space *mapping, struct folio *folio,
                           gfp_t gfp);
 
 
  * An interface that causes the system to free clean pages and flush
  * dirty pages is already available as msync(MS_INVALIDATE).
  */
-static long madvise_dontneed_single_vma(struct vm_area_struct *vma,
+static long madvise_dontneed_single_vma(struct madvise_behavior *madv_behavior,
+                                       struct vm_area_struct *vma,
                                        unsigned long start, unsigned long end)
 {
        struct zap_details details = {
                .even_cows = true,
        };
 
-       zap_page_range_single(vma, start, end - start, &details);
+       zap_page_range_single_batched(
+                       madv_behavior->tlb, vma, start, end - start, &details);
        return 0;
 }
 
        }
 
        if (behavior == MADV_DONTNEED || behavior == MADV_DONTNEED_LOCKED)
-               return madvise_dontneed_single_vma(vma, start, end);
+               return madvise_dontneed_single_vma(
+                               madv_behavior, vma, start, end);
        else if (behavior == MADV_FREE)
                return madvise_free_single_vma(madv_behavior, vma, start, end);
        else
 static bool madvise_batch_tlb_flush(int behavior)
 {
        switch (behavior) {
+       case MADV_DONTNEED:
+       case MADV_DONTNEED_LOCKED:
        case MADV_FREE:
                return true;
        default:
 
        mmu_notifier_invalidate_range_end(&range);
 }
 
-/*
+/**
  * zap_page_range_single_batched - remove user pages in a given range
  * @tlb: pointer to the caller's struct mmu_gather
  * @vma: vm_area_struct holding the applicable pages
  * @tlb shouldn't be NULL.  The range must fit into one VMA.  If @vma is for
  * hugetlb, @tlb is flushed and re-initialized by this function.
  */
-static void zap_page_range_single_batched(struct mmu_gather *tlb,
+void zap_page_range_single_batched(struct mmu_gather *tlb,
                struct vm_area_struct *vma, unsigned long address,
                unsigned long size, struct zap_details *details)
 {