Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

mm: lock newly mapped VMA which can be modified after it becomes visible

mmap_region adds a newly created VMA into VMA tree and might modify it
afterwards before dropping the mmap_lock. This poses a problem for page
faults handled under per-VMA locks because they don't take the mmap_lock
and can stumble on this VMA while it's still being modified. Currently
this does not pose a problem since post-addition modifications are done
only for file-backed VMAs, which are not handled under per-VMA lock.
However, once support for handling file-backed page faults with per-VMA
locks is added, this will become a race.

Fix this by write-locking the VMA before inserting it into the VMA tree.
Other places where a new VMA is added into VMA tree do not modify it
after the insertion, so do not need the same locking.

Cc: stable@vger.kernel.org
Signed-off-by: Suren Baghdasaryan <surenb@google.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Suren Baghdasaryan and committed by
Linus Torvalds
33313a74 c137381f

+2
+2
mm/mmap.c
··· 2812 2812 if (vma->vm_file) 2813 2813 i_mmap_lock_write(vma->vm_file->f_mapping); 2814 2814 2815 + /* Lock the VMA since it is modified after insertion into VMA tree */ 2816 + vma_start_write(vma); 2815 2817 vma_iter_store(&vmi, vma); 2816 2818 mm->map_count++; 2817 2819 if (vma->vm_file) {