From: Liam R. Howlett Date: Wed, 25 Nov 2020 01:23:48 +0000 (-0500) Subject: mmap: Avoid modifying maple tree in __vma_adjust more than necessary X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=d06a7bb52d132ca937beb46739531873cf420481;p=users%2Fjedix%2Flinux-maple.git mmap: Avoid modifying maple tree in __vma_adjust more than necessary Signed-off-by: Liam R. Howlett --- 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); }