Re: [PATCH 00/43] VMA type safety through VMA iterator

From: Liam Howlett
Date: Tue Nov 29 2022 - 19:47:11 EST


* Liam Howlett <liam.howlett@xxxxxxxxxx> [221129 11:44]:
> From: "Liam R. Howlett" <Liam.Howlett@xxxxxxxxxx>
>
> Andrew,
>
> These patches are for 6.2.

Slight correction, that should be for 6.3

>
> This patch set expands the VMA iterator API to provide type safety to
> the VMA operations using the maple tree, as requested by Linus for 6.2

This version should also be 6.3, Linus didn't specify a version.

> [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 is
> 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 and 4.
>
> While cleaning up the state, the duplicate locking code 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@xxxxxxxxxxxxxx/
>
> Liam R. Howlett (43):
> 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
> 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()
> mm: Switch vma_merge(), split_vma(), and __split_vma to vma iterator
> 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 | 14 +-
> fs/userfaultfd.c | 88 ++-
> 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 | 12 +-
> lib/test_maple_tree.c | 72 +++
> mm/filemap.c | 2 +-
> mm/internal.h | 13 +
> mm/madvise.c | 13 +-
> mm/mempolicy.c | 25 +-
> mm/mlock.c | 57 +-
> mm/mmap.c | 1071 ++++++++++++++++++------------------
> mm/mprotect.c | 47 +-
> mm/mremap.c | 42 +-
> mm/rmap.c | 4 +-
> 22 files changed, 862 insertions(+), 770 deletions(-)
>
> --
> 2.35.1