mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/
synced 2026-10-31 05:15:34 +00:00
To enable SLAB_TYPESAFE_BY_RCU for vma cache we need to ensure that object reuse before RCU grace period is over will be detected by lock_vma_under_rcu(). Current checks are sufficient as long as vma is detached before it is freed. The only place this is not currently happening is in exit_mmap(). Add the missing vma_mark_detached() in exit_mmap(). Another issue which might trick lock_vma_under_rcu() during vma reuse is vm_area_dup(), which copies the entire content of the vma into a new one, overriding new vma's vm_refcnt and temporarily making it appear as attached. This might trick a racing lock_vma_under_rcu() to operate on a reused vma if it found the vma before it got reused. To prevent this situation, we should ensure that vm_refcnt stays at detached state (0) when it is copied and advances to attached state only after it is added into the vma tree. Introduce vm_area_init_from() which preserves new vma's vm_refcnt and use it in vm_area_dup(). Since all vmas are in detached state with no current readers when they are freed, lock_vma_under_rcu() will not be able to take vm_refcnt after vma got detached even if vma is reused. vma_mark_attached() in modified to include a release fence to ensure all stores to the vma happen before vm_refcnt gets initialized. Finally, make vm_area_cachep SLAB_TYPESAFE_BY_RCU. This will facilitate vm_area_struct reuse and will minimize the number of call_rcu() calls. [surenb@google.com: remove atomic_set_release() usage in tools/] Link: https://lkml.kernel.org/r/20250217054351.2973666-1-surenb@google.com Link: https://lkml.kernel.org/r/20250213224655.1680278-18-surenb@google.com Signed-off-by: Suren Baghdasaryan <surenb@google.com> Reviewed-by: Vlastimil Babka <vbabka@suse.cz> Tested-by: Shivank Garg <shivankg@amd.com> Link: https://lkml.kernel.org/r/5e19ec93-8307-47c2-bb13-3ddf7150624e@amd.com Cc: Christian Brauner <brauner@kernel.org> Cc: David Hildenbrand <david@redhat.com> Cc: David Howells <dhowells@redhat.com> Cc: Davidlohr Bueso <dave@stgolabs.net> Cc: Hugh Dickins <hughd@google.com> Cc: Jann Horn <jannh@google.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Jonathan Corbet <corbet@lwn.net> Cc: Klara Modin <klarasmodin@gmail.com> Cc: Liam R. Howlett <Liam.Howlett@Oracle.com> Cc: Lokesh Gidra <lokeshgidra@google.com> Cc: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> Cc: Mateusz Guzik <mjguzik@gmail.com> Cc: Matthew Wilcox <willy@infradead.org> Cc: Mel Gorman <mgorman@techsingularity.net> Cc: Michal Hocko <mhocko@suse.com> Cc: Minchan Kim <minchan@google.com> Cc: Oleg Nesterov <oleg@redhat.com> Cc: Pasha Tatashin <pasha.tatashin@soleen.com> Cc: "Paul E . McKenney" <paulmck@kernel.org> Cc: Peter Xu <peterx@redhat.com> Cc: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Shakeel Butt <shakeel.butt@linux.dev> Cc: Sourav Panda <souravpanda@google.com> Cc: Wei Yang <richard.weiyang@gmail.com> Cc: Will Deacon <will@kernel.org> Cc: Heiko Carstens <hca@linux.ibm.com> Cc: Stephen Rothwell <sfr@canb.auug.org.au> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
History
|
|
|---|---|---|
| .. | ||
| sched | ||
| unaligned | ||
| align.h | ||
| arm-smccc.h | ||
| atomic.h | ||
| bitfield.h | ||
| bitmap.h | ||
| bitops.h | ||
| bits.h | ||
| btf_ids.h | ||
| bug.h | ||
| build_bug.h | ||
| cache.h | ||
| compiler-gcc.h | ||
| compiler.h | ||
| compiler_types.h | ||
| const.h | ||
| coresight-pmu.h | ||
| ctype.h | ||
| debugfs.h | ||
| delay.h | ||
| err.h | ||
| export.h | ||
| filter.h | ||
| find.h | ||
| ftrace.h | ||
| gfp.h | ||
| gfp_types.h | ||
| hash.h | ||
| hashtable.h | ||
| init.h | ||
| interrupt.h | ||
| interval_tree_generic.h | ||
| io.h | ||
| jhash.h | ||
| kallsyms.h | ||
| kasan-tags.h | ||
| kconfig.h | ||
| kern_levels.h | ||
| kernel.h | ||
| linkage.h | ||
| list.h | ||
| list_sort.h | ||
| log2.h | ||
| math.h | ||
| math64.h | ||
| mm.h | ||
| module.h | ||
| mutex.h | ||
| nmi.h | ||
| numa.h | ||
| objtool_types.h | ||
| overflow.h | ||
| panic.h | ||
| pfn.h | ||
| poison.h | ||
| rbtree.h | ||
| rbtree_augmented.h | ||
| rcu.h | ||
| refcount.h | ||
| ring_buffer.h | ||
| rwsem.h | ||
| seq_file.h | ||
| sizes.h | ||
| slab.h | ||
| spinlock.h | ||
| static_call_types.h | ||
| string.h | ||
| stringify.h | ||
| time64.h | ||
| types.h | ||
| unaligned.h | ||
| zalloc.h | ||