From d06a7bb52d132ca937beb46739531873cf420481 Mon Sep 17 00:00:00 2001 From: "Liam R. Howlett" Date: Tue, 24 Nov 2020 20:23:48 -0500 Subject: [PATCH] mmap: Avoid modifying maple tree in __vma_adjust more than necessary Signed-off-by: Liam R. Howlett --- mm/mmap.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/mm/mmap.c b/mm/mmap.c index e20403ad4aed..5d7d798fb82f 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -743,7 +743,7 @@ int __vma_adjust(struct vm_area_struct *vma, unsigned long start, struct rb_root_cached *root = NULL; struct anon_vma *anon_vma = NULL; struct file *file = vma->vm_file; - bool start_changed = false, end_changed = false; + bool vma_changed = false; long adjust_next = 0; int remove_next = 0; @@ -872,21 +872,21 @@ again: } if (start != vma->vm_start) { - unsigned long old_start = vma->vm_start; + if (vma->vm_start < start) + vma_mt_szero(mm, vma->vm_start, start); + else + vma_changed = true; vma->vm_start = start; - if (old_start < start) - vma_mt_szero(mm, old_start, start); - start_changed = true; } if (end != vma->vm_end) { - unsigned long old_end = vma->vm_end; + if (vma->vm_end > end) + vma_mt_szero(mm, end, vma->vm_end); + else + vma_changed = true; vma->vm_end = end; - if (old_end > end) - vma_mt_szero(mm, end, old_end); - end_changed = true; } - if (end_changed || start_changed) + if (vma_changed) vma_mt_store(mm, vma); vma->vm_pgoff = pgoff; @@ -914,7 +914,7 @@ again: * (it may either follow vma or precede it). */ __insert_vm_struct(mm, insert); - } else if (end_changed && !next) { + } else if (vma_changed && !next) { mm->highest_vm_end = vm_end_gap(vma); } -- 2.50.1