madvise_dontneed_free() can be optimized to batch tlb flushes by receiving mmu_gather object that initialized and finished outside, and doing only gathering of tlb entries that need to be flushed into the received mmu_gather object. But the function is receiving only one single behavior integer value. Update it to receive 'struct madvise_behavior' object so that upcoming tlb flushes batching optimization can pass the mmu_gather object. Signed-off-by: SeongJae Park <sj@xxxxxxxxxx> --- mm/madvise.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/mm/madvise.c b/mm/madvise.c index 6fa7dabe5bad..73a4323197e2 100644 --- a/mm/madvise.c +++ b/mm/madvise.c @@ -890,11 +890,16 @@ static bool madvise_dontneed_free_valid_vma(struct vm_area_struct *vma, return true; } +struct madvise_behavior { + int behavior; +}; + static long madvise_dontneed_free(struct vm_area_struct *vma, struct vm_area_struct **prev, unsigned long start, unsigned long end, - int behavior) + struct madvise_behavior *madv_behavior) { + int behavior = madv_behavior->behavior; struct mm_struct *mm = vma->vm_mm; *prev = vma; @@ -1241,10 +1246,6 @@ static long madvise_guard_remove(struct vm_area_struct *vma, &guard_remove_walk_ops, NULL); } -struct madvise_behavior { - int behavior; -}; - /* * Apply an madvise behavior to a region of a vma. madvise_update_vma * will handle splitting a vm area into separate areas, each area with its own @@ -1276,7 +1277,7 @@ static int madvise_vma_behavior(struct vm_area_struct *vma, case MADV_FREE: case MADV_DONTNEED: case MADV_DONTNEED_LOCKED: - return madvise_dontneed_free(vma, prev, start, end, behavior); + return madvise_dontneed_free(vma, prev, start, end, arg); case MADV_NORMAL: new_flags = new_flags & ~VM_RAND_READ & ~VM_SEQ_READ; break; -- 2.39.5