Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

mm: update fork mm->flags initialisation to use bitmap

We now need to account for flag initialisation on fork. We retain the
existing logic as much as we can, but dub the existing flag mask legacy.

These flags are therefore required to fit in the first 32-bits of the
flags field.

However, further flag propagation upon fork can be implemented in
mm_init() on a per-flag basis.

We ensure we clear the entire bitmap prior to setting it, and use
__mm_flags_get_word() and __mm_flags_set_word() to manipulate these legacy
fields efficiently.

Link: https://lkml.kernel.org/r/9fb8954a7a0f0184f012a8e66f8565bcbab014ba.1755012943.git.lorenzo.stoakes@oracle.com
Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Reviewed-by: Liam R. Howlett <Liam.Howlett@oracle.com>
Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
Acked-by: David Hildenbrand <david@redhat.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Gordeev <agordeev@linux.ibm.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Andreas Larsson <andreas@gaisler.com>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Baolin Wang <baolin.wang@linux.alibaba.com>
Cc: Barry Song <baohua@kernel.org>
Cc: Ben Segall <bsegall@google.com>
Cc: Borislav Betkov <bp@alien8.de>
Cc: Chengming Zhou <chengming.zhou@linux.dev>
Cc: Christian Borntraeger <borntraeger@linux.ibm.com>
Cc: Christian Brauner <brauner@kernel.org>
Cc: David Rientjes <rientjes@google.com>
Cc: David S. Miller <davem@davemloft.net>
Cc: Dev Jain <dev.jain@arm.com>
Cc: Dietmar Eggemann <dietmar.eggemann@arm.com>
Cc: Gerald Schaefer <gerald.schaefer@linux.ibm.com>
Cc: Heiko Carstens <hca@linux.ibm.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jan Kara <jack@suse.cz>
Cc: Jann Horn <jannh@google.com>
Cc: Jason Gunthorpe <jgg@ziepe.ca>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: John Hubbard <jhubbard@nvidia.com>
Cc: Juri Lelli <juri.lelli@redhat.com>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Kees Cook <kees@kernel.org>
Cc: Marc Rutland <mark.rutland@arm.com>
Cc: Mariano Pache <npache@redhat.com>
Cc: "Masami Hiramatsu (Google)" <mhiramat@kernel.org>
Cc: Mateusz Guzik <mjguzik@gmail.com>
Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
Cc: Mel Gorman <mgorman <mgorman@suse.de>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Namhyung kim <namhyung@kernel.org>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Peter Xu <peterx@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ryan Roberts <ryan.roberts@arm.com>
Cc: Shakeel Butt <shakeel.butt@linux.dev>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Sven Schnelle <svens@linux.ibm.com>
Cc: Thomas Gleinxer <tglx@linutronix.de>
Cc: Valentin Schneider <vschneid@redhat.com>
Cc: Vasily Gorbik <gor@linux.ibm.com>
Cc: Vincent Guittot <vincent.guittot@linaro.org>
Cc: Vlastimil Babka <vbabka@suse.cz>
Cc: xu xin <xu.xin16@zte.com.cn>
Cc: Zi Yan <ziy@nvidia.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

authored by

Lorenzo Stoakes and committed by
Andrew Morton
19148a19 01f86753

+15 -5
+10 -3
include/linux/mm_types.h
··· 1831 1831 #define MMF_TOPDOWN 31 /* mm searches top down by default */ 1832 1832 #define MMF_TOPDOWN_MASK BIT(MMF_TOPDOWN) 1833 1833 1834 - #define MMF_INIT_MASK (MMF_DUMPABLE_MASK | MMF_DUMP_FILTER_MASK |\ 1834 + #define MMF_INIT_LEGACY_MASK (MMF_DUMPABLE_MASK | MMF_DUMP_FILTER_MASK |\ 1835 1835 MMF_DISABLE_THP_MASK | MMF_HAS_MDWE_MASK |\ 1836 1836 MMF_VM_MERGE_ANY_MASK | MMF_TOPDOWN_MASK) 1837 1837 1838 - static inline unsigned long mmf_init_flags(unsigned long flags) 1838 + /* Legacy flags must fit within 32 bits. */ 1839 + static_assert((u64)MMF_INIT_LEGACY_MASK <= (u64)UINT_MAX); 1840 + 1841 + /* 1842 + * Initialise legacy flags according to masks, propagating selected flags on 1843 + * fork. Further flag manipulation can be performed by the caller. 1844 + */ 1845 + static inline unsigned long mmf_init_legacy_flags(unsigned long flags) 1839 1846 { 1840 1847 if (flags & (1UL << MMF_HAS_MDWE_NO_INHERIT)) 1841 1848 flags &= ~((1UL << MMF_HAS_MDWE) | 1842 1849 (1UL << MMF_HAS_MDWE_NO_INHERIT)); 1843 - return flags & MMF_INIT_MASK; 1850 + return flags & MMF_INIT_LEGACY_MASK; 1844 1851 } 1845 1852 1846 1853 #endif /* _LINUX_MM_TYPES_H */
+5 -2
kernel/fork.c
··· 1057 1057 mm_init_uprobes_state(mm); 1058 1058 hugetlb_count_init(mm); 1059 1059 1060 + mm_flags_clear_all(mm); 1060 1061 if (current->mm) { 1061 - mm->flags = mmf_init_flags(current->mm->flags); 1062 + unsigned long flags = __mm_flags_get_word(current->mm); 1063 + 1064 + __mm_flags_set_word(mm, mmf_init_legacy_flags(flags)); 1062 1065 mm->def_flags = current->mm->def_flags & VM_INIT_DEF_MASK; 1063 1066 } else { 1064 - mm->flags = default_dump_filter; 1067 + __mm_flags_set_word(mm, default_dump_filter); 1065 1068 mm->def_flags = 0; 1066 1069 } 1067 1070