linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Liam Howlett <liam.howlett@oracle.com>
To: Qian Cai <quic_qiancai@quicinc.com>
Cc: "maple-tree@lists.infradead.org" <maple-tree@lists.infradead.org>,
	"linux-mm@kvack.org" <linux-mm@kvack.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	Yu Zhao <yuzhao@google.com>
Subject: Re: [PATCH v8 00/70] Introducing the Maple Tree
Date: Wed, 27 Apr 2022 16:51:50 +0000	[thread overview]
Message-ID: <20220427165139.5s3qcj2u5vqrvwlc@revolver> (raw)
In-Reply-To: <20220427161033.GA1935@qian>

[-- Attachment #1: Type: text/plain, Size: 3310 bytes --]

* Qian Cai <quic_qiancai@quicinc.com> [220427 12:10]:
> On Tue, Apr 26, 2022 at 03:06:19PM +0000, Liam Howlett wrote:
> > Andrew,
> > 
> > Please replace the patches in your mglru-maple branch with this set.  It should
> > be a drop in replacement for my patch range with the fixes into these
> > patches.  Adding the preallocation to work around the fs-reclaim LOCKDEP
> > issue caused enough changes to the patches to warrant a respin.
> > 
> > The last patch on the branch is still needed to fix vmscan after mglru
> > is applied.  ee4b1fc24f30 "mm/vmscan: Use VMA_ITERATOR in
> > get_next_vma()"
> > 
> > 
> > Here is the pretty cover letter you requested last time.
> > 
> > ------------------------------------
> > 
> > The maple tree is an RCU-safe range based B-tree designed to use modern
> > processor cache efficiently.  There are a number of places in the kernel
> > that a non-overlapping range-based tree would be beneficial, especially
> > one with a simple interface.  The first user that is covered in this
> > patch set is the vm_area_struct, where three data structures are
> > replaced by the maple tree: the augmented rbtree, the vma cache, and the
> > linked list of VMAs in the mm_struct.  The long term goal is to reduce
> > or remove the mmap_sem contention.
> > 
> > The tree has a branching factor of 10 for non-leaf nodes and 16 for leaf
> > nodes.  With the increased branching factor, it is significantly shorter than
> > the rbtree so it has fewer cache misses.  The removal of the linked list
> > between subsequent entries also reduces the cache misses and the need to pull
> > in the previous and next VMA during many tree alterations.
> > 
> > This patch set is based on v5.18-rc2
> > 
> > git: https://github.com/oracle/linux-uek/tree/howlett/maple/20220426
> > 
> > v8 changes:
> >  - Added preallocations before any potential edits to the tree when holding the
> > i_mmap_lock to avoid fs-reclaim issues on extreme memory pressure.
> >  - Fixed issue in mempolicy mas_for_each() loop.
> >  - Moved static definitions inside ifdef for DEBUG_MAPLE
> >  - Fixed compile warnings reported by build bots
> >  - Moved mas_dfs_preorder() to testing code
> >  - Changed __vma_adjust() to record the highest vma in case 6 instead of
> > finding it twice.
> >  - Fixed locking issue in exit_mmap()
> >  - Fixed up from/s-o-b ordering
> 
> Running some syscall fuzzer would trigger a crash.
> 
>  BUG: KASAN: use-after-free in mas_find
>  ma_dead_node at lib/maple_tree.c:532
>  (inlined by) mas_next_entry at lib/maple_tree.c:4637
>  (inlined by) mas_find at lib/maple_tree.c:5869
>  Read of size 8 at addr ffff88811c5e9c00 by task trinity-c0/1351
> 
>  CPU: 5 PID: 1351 Comm: trinity-c0 Not tainted 5.18.0-rc4-next-20220427 #3
>  Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.14.0-5.fc35 04/01/2014
>  Call Trace:
>   <TASK>
>   dump_stack_lvl
>   print_address_description.constprop.0.cold
>   print_report.cold
>   kasan_report
>   mas_find
>   apply_mlockall_flags


Thanks.  This is indeed an issue with 0d43186b36c1 (mm/mlock: use vma
iterator and instead of vma linked list)                                                 

Andrew, Please include this patch as a fix.

Thanks,
Liam

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-mm-mlock-Use-maple-state-in-apply_mlockall_flags.patch --]
[-- Type: text/x-diff; name="0001-mm-mlock-Use-maple-state-in-apply_mlockall_flags.patch", Size: 1576 bytes --]

From 62c50b9683d10ccaa0b689459efaa41794db129b Mon Sep 17 00:00:00 2001
From: "Liam R. Howlett" <Liam.Howlett@oracle.com>
Date: Wed, 27 Apr 2022 12:46:04 -0400
Subject: [PATCH] mm/mlock:  Use maple state in apply_mlockall_flags()

The vma iterator is for simple cases.  Since mlock_fixup() can cause the
tree to change and thus requires the maple state to be reset,
apply_mlockall_flags() is not a simple case.  Use a maple state and
call mas_pause() instead.

Fixes: 0d43186b36c1 (mm/mlock: use vma iterator and instead of vma
linked list)
Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
---
 mm/mlock.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/mm/mlock.c b/mm/mlock.c
index d8549b3dcb59..c41604ba5197 100644
--- a/mm/mlock.c
+++ b/mm/mlock.c
@@ -660,7 +660,7 @@ SYSCALL_DEFINE2(munlock, unsigned long, start, size_t, len)
  */
 static int apply_mlockall_flags(int flags)
 {
-	VMA_ITERATOR(vmi, current->mm, 0);
+	MA_STATE(mas, &current->mm->mm_mt, 0, 0);
 	struct vm_area_struct *vma, *prev = NULL;
 	vm_flags_t to_add = 0;
 
@@ -681,7 +681,7 @@ static int apply_mlockall_flags(int flags)
 			to_add |= VM_LOCKONFAULT;
 	}
 
-	for_each_vma(vmi, vma) {
+	mas_for_each(&mas, vma, ULONG_MAX) {
 		vm_flags_t newflags;
 
 		newflags = vma->vm_flags & VM_LOCKED_CLEAR_MASK;
@@ -689,6 +689,7 @@ static int apply_mlockall_flags(int flags)
 
 		/* Ignore errors */
 		mlock_fixup(vma, &prev, vma->vm_start, vma->vm_end, newflags);
+		mas_pause(&mas);
 		cond_resched();
 	}
 out:
-- 
2.35.1


  reply	other threads:[~2022-04-27 16:52 UTC|newest]

Thread overview: 114+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-26 15:06 [PATCH v8 00/70] Introducing the Maple Tree Liam Howlett
2022-04-26 15:06 ` [PATCH v8 01/70] radix tree test suite: add pr_err define Liam Howlett
2022-04-26 15:06 ` [PATCH v8 02/70] radix tree test suite: add kmem_cache_set_non_kernel() Liam Howlett
2022-04-26 15:06 ` [PATCH v8 05/70] radix tree test suite: add lockdep_is_held to header Liam Howlett
2022-04-26 15:06 ` [PATCH v8 03/70] radix tree test suite: add allocation counts and size to kmem_cache Liam Howlett
2022-04-26 15:06 ` [PATCH v8 04/70] radix tree test suite: add support for slab bulk APIs Liam Howlett
2022-04-26 15:06 ` [PATCH v8 06/70] mips: rename mt_init to mips_mt_init Liam Howlett
2022-04-26 15:06 ` [PATCH v8 07/70] Maple Tree: add new data structure Liam Howlett
2022-04-27 15:45   ` Liam Howlett
2022-04-26 15:06 ` [PATCH v8 08/70] lib/test_maple_tree: add testing for maple tree Liam Howlett
2022-04-26 15:06 ` [PATCH v8 09/70] mm: start tracking VMAs with " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 10/70] mm: add VMA iterator Liam Howlett
2022-04-26 15:06 ` [PATCH v8 12/70] mm/mmap: use the maple tree in find_vma() instead of the rbtree Liam Howlett
2022-04-26 15:06 ` [PATCH v8 11/70] mmap: use the VMA iterator in count_vma_pages_range() Liam Howlett
2022-04-26 15:06 ` [PATCH v8 13/70] mm/mmap: use the maple tree for find_vma_prev() instead of the rbtree Liam Howlett
2022-04-26 15:06 ` [PATCH v8 14/70] mm/mmap: use maple tree for unmapped_area{_topdown} Liam Howlett
2022-04-26 15:06 ` [PATCH v8 15/70] kernel/fork: use maple tree for dup_mmap() during forking Liam Howlett
2022-04-26 15:06 ` [PATCH v8 17/70] proc: remove VMA rbtree use from nommu Liam Howlett
2022-04-26 15:06 ` [PATCH v8 16/70] damon: Convert __damon_va_three_regions to use the VMA iterator Liam Howlett
2022-05-03 23:40   ` SeongJae Park
2022-04-26 15:06 ` [PATCH v8 18/70] mm: remove rb tree Liam Howlett
2022-04-26 15:06 ` [PATCH v8 21/70] mm: optimize find_exact_vma() to use vma_lookup() Liam Howlett
2022-04-26 15:06 ` [PATCH v8 20/70] xen: use vma_lookup() in privcmd_ioctl_mmap() Liam Howlett
2022-04-26 15:06 ` [PATCH v8 19/70] mmap: change zeroing of maple tree in __vma_adjust() Liam Howlett
2022-04-26 15:06 ` [PATCH v8 22/70] mm/khugepaged: optimize collapse_pte_mapped_thp() by using vma_lookup() Liam Howlett
2022-04-26 15:06 ` [PATCH v8 23/70] mm/mmap: change do_brk_flags() to expand existing VMA and add do_brk_munmap() Liam Howlett
2022-04-28 16:09   ` Guenter Roeck
2022-04-28 16:35     ` Liam Howlett
2022-04-28 17:13       ` Guenter Roeck
2022-04-28 20:19   ` Guenter Roeck
2022-04-29  0:38     ` Liam Howlett
2022-04-29  1:16       ` Andrew Morton
2022-05-02  0:14         ` Liam Howlett
2022-05-02  0:24           ` Andrew Morton
2022-05-02 10:18             ` Heiko Carstens
2022-05-02 13:31               ` Liam Howlett
2022-05-02 18:50                 ` Heiko Carstens
2022-05-03 19:48                   ` Heiko Carstens
2022-05-03 21:55                     ` Liam Howlett
2022-05-04  7:37                       ` Janosch Frank
2022-05-04 18:31                         ` David Hildenbrand
2022-05-04 18:47                           ` Liam Howlett
2022-06-29  7:04                           ` qemu-system-s390x hang in tcg (was: Re: [PATCH v8 23/70] mm/mmap: change do_brk_flags() to expand existing VMA and add do_brk_munmap()) Sven Schnelle
2022-06-29  8:10                             ` Alex Bennée
2022-06-29 10:46                               ` qemu-system-s390x hang in tcg Sven Schnelle
2022-06-29 12:18                                 ` Sven Schnelle
2022-06-29 14:52                                   ` Alex Bennée
2022-06-30  3:03                                 ` Richard Henderson
2022-05-02  7:08           ` [PATCH v8 23/70] mm/mmap: change do_brk_flags() to expand existing VMA and add do_brk_munmap() Juergen Gross
2022-04-26 15:06 ` [PATCH v8 26/70] mm: remove vmacache Liam Howlett
2022-04-26 15:06 ` [PATCH v8 25/70] mm/mmap: use advanced maple tree API for mmap_region() Liam Howlett
2022-04-26 15:06 ` [PATCH v8 24/70] mm: use maple tree operations for find_vma_intersection() Liam Howlett
2022-04-26 15:06 ` [PATCH v8 27/70] mm: convert vma_lookup() to use mtree_load() Liam Howlett
2022-04-26 15:06 ` [PATCH v8 28/70] mm/mmap: move mmap_region() below do_munmap() Liam Howlett
2022-04-26 15:06 ` [PATCH v8 31/70] arm64: remove mmap linked list from vdso Liam Howlett
2022-04-26 15:06 ` [PATCH v8 29/70] mm/mmap: reorganize munmap to use maple states Liam Howlett
2022-04-26 15:06 ` [PATCH v8 30/70] mm/mmap: change do_brk_munmap() to use do_mas_align_munmap() Liam Howlett
2022-04-26 15:06 ` [PATCH v8 32/70] arm64: Change elfcore for_each_mte_vma() to use VMA iterator Liam Howlett
2022-04-26 15:06 ` [PATCH v8 34/70] powerpc: remove mmap linked list walks Liam Howlett
2022-04-26 15:06 ` [PATCH v8 33/70] parisc: remove mmap linked list from cache handling Liam Howlett
2022-04-26 15:06 ` [PATCH v8 35/70] s390: remove vma linked list walks Liam Howlett
2022-04-26 15:06 ` [PATCH v8 37/70] xtensa: " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 36/70] x86: " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 38/70] cxl: remove vma linked list walk Liam Howlett
2022-04-26 15:06 ` [PATCH v8 39/70] optee: " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 40/70] um: " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 41/70] coredump: " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 43/70] fs/proc/base: use maple tree iterators in place of linked list Liam Howlett
2022-04-26 15:06 ` [PATCH v8 42/70] exec: use VMA iterator instead " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 45/70] userfaultfd: use maple tree iterator to iterate VMAs Liam Howlett
2022-04-27 15:43   ` Liam Howlett
2022-04-26 15:06 ` [PATCH v8 44/70] fs/proc/task_mmu: stop using linked list and highest_vm_end Liam Howlett
2022-04-26 15:06 ` [PATCH v8 48/70] perf: use VMA iterator Liam Howlett
2022-04-26 15:06 ` [PATCH v8 46/70] ipc/shm: use VMA iterator instead of linked list Liam Howlett
2022-04-26 15:06 ` [PATCH v8 47/70] acct: " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 49/70] sched: use maple tree iterator to walk VMAs Liam Howlett
2022-04-26 15:06 ` [PATCH v8 50/70] fork: use VMA iterator Liam Howlett
2022-04-26 15:06 ` [PATCH v8 53/70] mm/khugepaged: stop using vma linked list Liam Howlett
2022-04-26 15:06 ` [PATCH v8 51/70] bpf: remove VMA " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 52/70] mm/gup: use maple tree navigation instead of " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 56/70] mm/memcontrol: stop using mm->highest_vm_end Liam Howlett
2022-04-26 15:06 ` [PATCH v8 55/70] mm/madvise: use vma_find() instead of vma linked list Liam Howlett
2022-04-26 15:06 ` [PATCH v8 54/70] mm/ksm: use vma iterators " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 59/70] mm/mprotect: use maple tree navigation " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 58/70] mm/mlock: use vma iterator and " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 57/70] mm/mempolicy: use vma iterator & maple state " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 61/70] mm/msync: use vma_find() " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 60/70] mm/mremap: use vma_find_intersection() " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 63/70] mm/pagewalk: use vma_find() " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 62/70] mm/oom_kill: use maple tree iterators " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 64/70] mm/swapfile: use vma iterator " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 66/70] nommu: remove uses of VMA " Liam Howlett
2022-04-28 16:05   ` Guenter Roeck
2022-04-28 16:31   ` Guenter Roeck
2022-04-29 20:16     ` Liam Howlett
2022-04-26 15:06 ` [PATCH v8 65/70] i915: use the VMA iterator Liam Howlett
2022-04-26 15:06 ` [PATCH v8 67/70] riscv: use vma iterator for vdso Liam Howlett
2022-04-26 15:06 ` [PATCH v8 68/70] mm: remove the vma linked list Liam Howlett
2022-04-26 15:06 ` [PATCH v8 69/70] mm/mmap: drop range_has_overlap() function Liam Howlett
2022-04-26 15:06 ` [PATCH v8 70/70] mm/mmap.c: pass in mapping to __vma_link_file() Liam Howlett
2022-04-26 20:06 ` [PATCH v8 00/70] Introducing the Maple Tree Andrew Morton
2022-04-26 20:08 ` Andrew Morton
2022-04-26 20:23   ` Matthew Wilcox
2022-04-27 14:08   ` Liam Howlett
2022-04-27 17:33     ` Andrew Morton
2022-04-27 18:12       ` Matthew Wilcox
2022-05-01 20:26         ` Davidlohr Bueso
2022-05-01 23:56           ` Andrew Morton
2022-05-04  0:43             ` Liam Howlett
2022-04-28  2:28       ` Liam Howlett
2022-04-27 16:10 ` Qian Cai
2022-04-27 16:51   ` Liam Howlett [this message]
2022-04-27 20:21     ` Qian Cai
2022-04-27 22:41       ` Liam Howlett

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220427165139.5s3qcj2u5vqrvwlc@revolver \
    --to=liam.howlett@oracle.com \
    --cc=akpm@linux-foundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=maple-tree@lists.infradead.org \
    --cc=quic_qiancai@quicinc.com \
    --cc=yuzhao@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).