Commit ccf1d78d authored by Suren Baghdasaryan's avatar Suren Baghdasaryan Committed by Andrew Morton
Browse files

mm/mmap: move vma_prepare before vma_adjust_trans_huge

vma_prepare() acquires all locks required before VMA modifications.  Move
vma_prepare() before vma_adjust_trans_huge() so that VMA is locked before
any modification.

Link: https://lkml.kernel.org/r/20230227173632.3292573-15-surenb@google.com


Signed-off-by: default avatarSuren Baghdasaryan <surenb@google.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent c7322933
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -683,12 +683,12 @@ int vma_expand(struct vma_iterator *vmi, struct vm_area_struct *vma,
	if (vma_iter_prealloc(vmi))
		goto nomem;

	vma_prepare(&vp);
	vma_adjust_trans_huge(vma, start, end, 0);
	/* VMA iterator points to previous, so set to start if necessary */
	if (vma_iter_addr(vmi) != start)
		vma_iter_set(vmi, start);

	vma_prepare(&vp);
	vma->vm_start = start;
	vma->vm_end = end;
	vma->vm_pgoff = pgoff;
@@ -723,8 +723,8 @@ int vma_shrink(struct vma_iterator *vmi, struct vm_area_struct *vma,
		return -ENOMEM;

	init_vma_prep(&vp, vma);
	vma_adjust_trans_huge(vma, start, end, 0);
	vma_prepare(&vp);
	vma_adjust_trans_huge(vma, start, end, 0);

	if (vma->vm_start < start)
		vma_iter_clear(vmi, vma->vm_start, start);
@@ -1010,12 +1010,12 @@ struct vm_area_struct *vma_merge(struct vma_iterator *vmi, struct mm_struct *mm,
	if (vma_iter_prealloc(vmi))
		return NULL;

	vma_adjust_trans_huge(vma, vma_start, vma_end, adj_start);
	init_multi_vma_prep(&vp, vma, adjust, remove, remove2);
	VM_WARN_ON(vp.anon_vma && adjust && adjust->anon_vma &&
		   vp.anon_vma != adjust->anon_vma);

	vma_prepare(&vp);
	vma_adjust_trans_huge(vma, vma_start, vma_end, adj_start);
	if (vma_start < vma->vm_start || vma_end > vma->vm_end)
		vma_expanded = true;

@@ -2214,10 +2214,10 @@ int __split_vma(struct vma_iterator *vmi, struct vm_area_struct *vma,
	if (new->vm_ops && new->vm_ops->open)
		new->vm_ops->open(new);

	vma_adjust_trans_huge(vma, vma->vm_start, addr, 0);
	init_vma_prep(&vp, vma);
	vp.insert = new;
	vma_prepare(&vp);
	vma_adjust_trans_huge(vma, vma->vm_start, addr, 0);

	if (new_below) {
		vma->vm_start = addr;
@@ -2920,9 +2920,9 @@ static int do_brk_flags(struct vma_iterator *vmi, struct vm_area_struct *vma,
		if (vma_iter_prealloc(vmi))
			goto unacct_fail;

		vma_adjust_trans_huge(vma, vma->vm_start, addr + len, 0);
		init_vma_prep(&vp, vma);
		vma_prepare(&vp);
		vma_adjust_trans_huge(vma, vma->vm_start, addr + len, 0);
		vma->vm_end = addr + len;
		vm_flags_set(vma, VM_SOFTDIRTY);
		vma_iter_store(vmi, vma);