]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
mm: Enable maple tree RCU mode by default.
authorSuren Baghdasaryan <surenb@google.com>
Tue, 8 Nov 2022 17:40:09 +0000 (17:40 +0000)
committerLiam R. Howlett <Liam.Howlett@oracle.com>
Wed, 4 Jan 2023 20:59:24 +0000 (15:59 -0500)
Use the maple tree in RCU mode for VMA tracking.  This is necessary for
the use of per-VMA locking.  RCU mode is enabled by default but disabled
when exiting an mm and for the new tree during a fork.

Also enable RCU for the tree used in munmap operations to ensure the
nodes remain valid for readers.

Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
include/linux/mm_types.h
kernel/fork.c
mm/mmap.c

index 500e536796ca4ade1721e1ca82f4b09926e3c8a4..247aedb18d5c389cf0fb9f539e8b8cc8fbfa607b 100644 (file)
@@ -725,7 +725,8 @@ struct mm_struct {
        unsigned long cpu_bitmap[];
 };
 
-#define MM_MT_FLAGS    (MT_FLAGS_ALLOC_RANGE | MT_FLAGS_LOCK_EXTERN)
+#define MM_MT_FLAGS    (MT_FLAGS_ALLOC_RANGE | MT_FLAGS_LOCK_EXTERN | \
+                        MT_FLAGS_USE_RCU)
 extern struct mm_struct init_mm;
 
 /* Pointer magic because the dynamic array size confuses some compilers. */
index 08969f5aa38d5906b2f42f975054c62bc7f7bf80..2be88821fc8672c71405dea129f90ab66704a813 100644 (file)
@@ -614,6 +614,7 @@ static __latent_entropy int dup_mmap(struct mm_struct *mm,
        if (retval)
                goto out;
 
+       mt_clear_in_rcu(mas.tree);
        mas_for_each(&old_mas, mpnt, ULONG_MAX) {
                struct file *file;
 
@@ -700,6 +701,8 @@ static __latent_entropy int dup_mmap(struct mm_struct *mm,
        retval = arch_dup_mmap(oldmm, mm);
 loop_out:
        mas_destroy(&mas);
+       if (!retval)
+               mt_set_in_rcu(mas.tree);
 out:
        mmap_write_unlock(mm);
        flush_tlb_mm(oldmm);
index c3c5c1d6103d1cbaff34ceb9e12cc17f410a33d0..ed4836142423198224e7e696c535ce048c61fbcb 100644 (file)
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -2308,7 +2308,8 @@ do_mas_align_munmap(struct ma_state *mas, struct vm_area_struct *vma,
        int count = 0;
        int error = -ENOMEM;
        MA_STATE(mas_detach, &mt_detach, 0, 0);
-       mt_init_flags(&mt_detach, MT_FLAGS_LOCK_EXTERN);
+       mt_init_flags(&mt_detach, mas->tree->ma_flags &
+                     (MT_FLAGS_LOCK_MASK | MT_FLAGS_USE_RCU));
        mt_set_external_lock(&mt_detach, &mm->mmap_lock);
 
        if (mas_preallocate(mas, vma, GFP_KERNEL))
@@ -3100,6 +3101,7 @@ void exit_mmap(struct mm_struct *mm)
         */
        set_bit(MMF_OOM_SKIP, &mm->flags);
        mmap_write_lock(mm);
+       mt_clear_in_rcu(&mm->mm_mt);
        free_pgtables(&tlb, &mm->mm_mt, vma, FIRST_USER_ADDRESS,
                      USER_PGTABLES_CEILING);
        tlb_finish_mmu(&tlb);