[PATCH v3 00/48] VMA tree type safety and remove __vma_adjust()

Liam Howlett
2023-01-17T02:34:25Z

Andrew,

This patch set does two things: 1. Clean up, including removal of
__vma_adjust() and 2. Extends the VMA iterator API to provide type
safety to the VMA operations using the maple tree, as requested by Linus
[1].

It also addresses another issue of usability brought up by Linus about
needing to modify the maple state within the loops. The maple state has
been replaced by the VMA iterator and the iterator is now modified
within the MM code so the caller should not need to worry about doing
the work themselves when tree modifications occur.

This brought up a potential inconsistency of the iterator state and what
the user expects, so the inconsistency is addressed to keep the VMA
iterator safe for use after the looping over a VMA range. This is
addressed in patch 3 ("maple_tree: Reduce user error potential") and 4
("test_maple_tree: Test modifications while iterating").

While cleaning up the state, the duplicate locking code in mm/mmap.c
introduced by the maple tree has been address by abstracting it to two
functions: vma_prepare() and vma_complete(). These abstractions allowed
for a much simpler __vma_adjust(), which eventually leads to the removal
of the __vma_adjust() function by placing the logic into the vma_merge()
function itself.

1. https://lore.kernel.org/linux-mm/CAHk-=wg9WQXBGkNdKD2bqocnN73rDswuWsavBB7T-tekykEn_A@mail.gmail.com/

Changes since v2:
- Squashed in __split_vma() definition fix, cause of build failures
- Included fix for invalidating maple state (adds a patch)
- Remove mas_set_range() from do_brk_flags() - Thanks Vernon Yang
- Converted nommu to the vma iterator (adds 2 patches)
- Boot tested on s390, arm64, m68k nommu, x86_64
- Checked arm64 failing tests cases against new code - Thanks Mark Brown
- Check for write errors to the tree in damon test code - Thanks
SeongJae Park
- Fix mas_prev() and mas_find() state handling (adds a patch)
- Fix mlock() conversion bug reported by syzkaller - Thanks
syzbot+ea4b1a683ce48cd567b1@syzkaller.appspotmail.com
- Remove unnecessary vma_iter_set() from userfaultfd conversion

v2: https://lore.kernel.org/linux-mm/20230105191517.3099082-1-Liam.Howlett@oracle.com/
v1: https://lore.kernel.org/linux-mm/20221129164352.3374638-1-Liam.Howlett@oracle.com/

Liam R. Howlett (48):
maple_tree: Add mas_init() function
maple_tree: Fix potential rcu issue
maple_tree: Reduce user error potential
test_maple_tree: Test modifications while iterating
maple_tree: Fix handle of invalidated state in mas_wr_store_setup()
maple_tree: Fix mas_prev() and mas_find() state handling
mm: Expand vma iterator interface
mm/mmap: convert brk to use vma iterator
kernel/fork: Convert forking to using the vmi iterator
mmap: Convert vma_link() vma iterator
mm/mmap: Remove preallocation from do_mas_align_munmap()
mmap: Change do_mas_munmap and do_mas_aligned_munmap() to use vma
iterator
mmap: Convert vma_expand() to use vma iterator
mm: Add temporary vma iterator versions of vma_merge(), split_vma(),
and __split_vma()
ipc/shm: Use the vma iterator for munmap calls
userfaultfd: Use vma iterator
mm: Change mprotect_fixup to vma iterator
mlock: Convert mlock to vma iterator
coredump: Convert to vma iterator
mempolicy: Convert to vma iterator
task_mmu: Convert to vma iterator
sched: Convert to vma iterator
madvise: Use vmi iterator for __split_vma() and vma_merge()
mmap: Pass through vmi iterator to __split_vma()
mmap: Use vmi version of vma_merge()
mm/mremap: Use vmi version of vma_merge()
nommu: Convert nommu to using the vma iterator
nommu: Pass through vma iterator to shrink_vma()
mm: Switch vma_merge(), split_vma(), and __split_vma to vma iterator
mm/damon: Stop using vma_mas_store() for maple tree store
mmap: Convert __vma_adjust() to use vma iterator
mm: Pass through vma iterator to __vma_adjust()
madvise: Use split_vma() instead of __split_vma()
mm: Remove unnecessary write to vma iterator in __vma_adjust()
mm: Pass vma iterator through to __vma_adjust()
mm: Add vma iterator to vma_adjust() arguments
mmap: Clean up mmap_region() unrolling
mm: Change munmap splitting order and move_vma()
mm/mmap: move anon_vma setting in __vma_adjust()
mm/mmap: Refactor locking out of __vma_adjust()
mm/mmap: Use vma_prepare() and vma_complete() in vma_expand()
mm/mmap: Introduce init_vma_prep() and init_multi_vma_prep()
mm: Don't use __vma_adjust() in __split_vma()
mm/mmap: Don't use __vma_adjust() in shift_arg_pages()
mm/mmap: Introduce dup_vma_anon() helper
mm/mmap: Convert do_brk_flags() to use vma_prepare() and
vma_complete()
mm/mmap: Remove __vma_adjust()
vma_merge: Set vma iterator to correct position.

fs/coredump.c | 8 +-
fs/exec.c | 16 +-
fs/proc/task_mmu.c | 27 +-
fs/userfaultfd.c | 87 ++-
include/linux/maple_tree.h | 11 +
include/linux/mm.h | 87 ++-
include/linux/mm_types.h | 4 +-
ipc/shm.c | 11 +-
kernel/events/uprobes.c | 2 +-
kernel/fork.c | 19 +-
kernel/sched/fair.c | 14 +-
lib/maple_tree.c | 19 +-
lib/test_maple_tree.c | 72 +++
mm/damon/vaddr-test.h | 19 +-
mm/filemap.c | 2 +-
mm/internal.h | 79 +++
mm/madvise.c | 13 +-
mm/mempolicy.c | 25 +-
mm/mlock.c | 57 +-
mm/mmap.c | 1020 +++++++++++++++++-------------------
mm/mprotect.c | 47 +-
mm/mremap.c | 42 +-
mm/nommu.c | 124 ++---
mm/rmap.c | 15 +-
24 files changed, 947 insertions(+), 873 deletions(-)

--
2.35.1