From d5167f411356cec5e10f5b32f864e0b719075960 Mon Sep 17 00:00:00 2001 From: "Matthew Wilcox (Oracle)" Date: Tue, 19 Oct 2021 15:07:57 -0400 Subject: [PATCH] fix-parent --- arch/x86/kernel/tboot.c | 2 +- drivers/firmware/efi/efi.c | 2 +- include/linux/mm_types.h | 1 + kernel/fork.c | 3 ++- mm/init-mm.c | 2 +- mm/internal.h | 4 ---- mm/mmap.c | 15 +++++++++++---- 7 files changed, 17 insertions(+), 12 deletions(-) diff --git a/arch/x86/kernel/tboot.c b/arch/x86/kernel/tboot.c index 6f978f722dff..859e8d2ea070 100644 --- a/arch/x86/kernel/tboot.c +++ b/arch/x86/kernel/tboot.c @@ -98,7 +98,7 @@ void __init tboot_probe(void) static pgd_t *tboot_pg_dir; static struct mm_struct tboot_mm = { .mm_rb = RB_ROOT, - .mm_mt = MTREE_INIT(mm_mt, MAPLE_ALLOC_RANGE), + .mm_mt = MTREE_INIT_EXT(mm_mt, MM_MT_FLAGS, tboot_mm.mmap_lock), .pgd = swapper_pg_dir, .mm_users = ATOMIC_INIT(2), .mm_count = ATOMIC_INIT(1), diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c index 1aaecca36e23..5ef8c668db25 100644 --- a/drivers/firmware/efi/efi.c +++ b/drivers/firmware/efi/efi.c @@ -55,7 +55,7 @@ static unsigned long __initdata rt_prop = EFI_INVALID_TABLE_ADDR; struct mm_struct efi_mm = { .mm_rb = RB_ROOT, - .mm_mt = MTREE_INIT(mm_mt, MAPLE_ALLOC_RANGE), + .mm_mt = MTREE_INIT_EXT(mm_mt, MM_MT_FLAGS, efi_mm.mmap_lock), .mm_users = ATOMIC_INIT(2), .mm_count = ATOMIC_INIT(1), .write_protect_seq = SEQCNT_ZERO(efi_mm.write_protect_seq), diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index 2fc27dff8b6c..86959ece1284 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h @@ -591,6 +591,7 @@ struct mm_struct { unsigned long cpu_bitmap[]; }; +#define MM_MT_FLAGS (MT_FLAGS_ALLOC_RANGE | MT_FLAGS_LOCK_EXTERN) extern struct mm_struct init_mm; /* Pointer magic because the dynamic array size confuses some compilers. */ diff --git a/kernel/fork.c b/kernel/fork.c index e8d602de40e8..3f3f823541cc 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -1041,7 +1041,8 @@ static struct mm_struct *mm_init(struct mm_struct *mm, struct task_struct *p, { mm->mmap = NULL; mm->mm_rb = RB_ROOT; - mt_init_flags(&mm->mm_mt, MAPLE_ALLOC_RANGE); + mt_init_flags(&mm->mm_mt, MM_MT_FLAGS); + mt_set_external_lock(&mm->mm_mt, &mm->mmap_lock); mm->vmacache_seqnum = 0; atomic_set(&mm->mm_users, 1); atomic_set(&mm->mm_count, 1); diff --git a/mm/init-mm.c b/mm/init-mm.c index e4a058f7e8b6..7622ca24eeb7 100644 --- a/mm/init-mm.c +++ b/mm/init-mm.c @@ -29,7 +29,7 @@ */ struct mm_struct init_mm = { .mm_rb = RB_ROOT, - .mm_mt = MTREE_INIT(mm_mt, MAPLE_ALLOC_RANGE), + .mm_mt = MTREE_INIT_EXT(mm_mt, MM_MT_FLAGS, init_mm.mmap_lock), .pgd = swapper_pg_dir, .mm_users = ATOMIC_INIT(2), .mm_count = ATOMIC_INIT(1), diff --git a/mm/internal.h b/mm/internal.h index 3f45e1d0c02b..28970ab39d6a 100644 --- a/mm/internal.h +++ b/mm/internal.h @@ -375,9 +375,7 @@ static inline int vma_mas_store(struct vm_area_struct *vma, struct ma_state *mas #endif mas->index = vma->vm_start; mas->last = vma->vm_end - 1; - mas_lock(mas); ret = mas_store_gfp(mas, vma, GFP_KERNEL); - mas_unlock(mas); return ret; } @@ -411,9 +409,7 @@ static inline int vma_mas_remove(struct vm_area_struct *vma, struct ma_state *ma #endif mas->index = vma->vm_start; mas->last = vma->vm_end - 1; - mas_lock(mas); ret = mas_store_gfp(mas, NULL, GFP_KERNEL); - mas_unlock(mas); return ret; } diff --git a/mm/mmap.c b/mm/mmap.c index b9078e6d7d61..4ab971a80625 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -762,8 +762,10 @@ static void __vma_link_file(struct vm_area_struct *vma) static inline void vma_mt_szero(struct mm_struct *mm, unsigned long start, unsigned long end) { + MA_STATE(mas, &mm->mm_mt, start, end - 1); + trace_vma_mt_szero(mm, start, end); - mtree_store_range(&mm->mm_mt, start, end - 1, NULL, GFP_KERNEL); + mas_erase(&mas); } /* @@ -777,9 +779,10 @@ static inline void vma_mt_szero(struct mm_struct *mm, unsigned long start, static inline void vma_mt_store(struct mm_struct *mm, struct vm_area_struct *vma) { + MA_STATE(mas, &mm->mm_mt, vma->vm_start, vma->vm_end - 1); + trace_vma_mt_store(mm, vma); - mtree_store_range(&mm->mm_mt, vma->vm_start, vma->vm_end - 1, vma, - GFP_KERNEL); + mas_store_gfp(&mas, vma, GFP_KERNEL); } void vma_store(struct mm_struct *mm, struct vm_area_struct *vma) { @@ -3382,7 +3385,11 @@ void exit_mmap(struct mm_struct *mm) } trace_exit_mmap(mm); - mtree_destroy(&mm->mm_mt); + /* Take the mmap lock to satisfy lockdep. Nobody else can see it */ + mmap_write_lock(mm); + __mt_destroy(&mm->mm_mt); + mmap_write_unlock(mm); + vm_unacct_memory(nr_accounted); } -- 2.50.1