mirror of https://github.com/torvalds/linux.git
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>
This commit is contained in:
parent
01f86753a0
commit
19148a19da
|
|
@ -1831,16 +1831,23 @@ enum {
|
||||||
#define MMF_TOPDOWN 31 /* mm searches top down by default */
|
#define MMF_TOPDOWN 31 /* mm searches top down by default */
|
||||||
#define MMF_TOPDOWN_MASK BIT(MMF_TOPDOWN)
|
#define MMF_TOPDOWN_MASK BIT(MMF_TOPDOWN)
|
||||||
|
|
||||||
#define MMF_INIT_MASK (MMF_DUMPABLE_MASK | MMF_DUMP_FILTER_MASK |\
|
#define MMF_INIT_LEGACY_MASK (MMF_DUMPABLE_MASK | MMF_DUMP_FILTER_MASK |\
|
||||||
MMF_DISABLE_THP_MASK | MMF_HAS_MDWE_MASK |\
|
MMF_DISABLE_THP_MASK | MMF_HAS_MDWE_MASK |\
|
||||||
MMF_VM_MERGE_ANY_MASK | MMF_TOPDOWN_MASK)
|
MMF_VM_MERGE_ANY_MASK | MMF_TOPDOWN_MASK)
|
||||||
|
|
||||||
static inline unsigned long mmf_init_flags(unsigned long flags)
|
/* Legacy flags must fit within 32 bits. */
|
||||||
|
static_assert((u64)MMF_INIT_LEGACY_MASK <= (u64)UINT_MAX);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initialise legacy flags according to masks, propagating selected flags on
|
||||||
|
* fork. Further flag manipulation can be performed by the caller.
|
||||||
|
*/
|
||||||
|
static inline unsigned long mmf_init_legacy_flags(unsigned long flags)
|
||||||
{
|
{
|
||||||
if (flags & (1UL << MMF_HAS_MDWE_NO_INHERIT))
|
if (flags & (1UL << MMF_HAS_MDWE_NO_INHERIT))
|
||||||
flags &= ~((1UL << MMF_HAS_MDWE) |
|
flags &= ~((1UL << MMF_HAS_MDWE) |
|
||||||
(1UL << MMF_HAS_MDWE_NO_INHERIT));
|
(1UL << MMF_HAS_MDWE_NO_INHERIT));
|
||||||
return flags & MMF_INIT_MASK;
|
return flags & MMF_INIT_LEGACY_MASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* _LINUX_MM_TYPES_H */
|
#endif /* _LINUX_MM_TYPES_H */
|
||||||
|
|
|
||||||
|
|
@ -1057,11 +1057,14 @@ static struct mm_struct *mm_init(struct mm_struct *mm, struct task_struct *p,
|
||||||
mm_init_uprobes_state(mm);
|
mm_init_uprobes_state(mm);
|
||||||
hugetlb_count_init(mm);
|
hugetlb_count_init(mm);
|
||||||
|
|
||||||
|
mm_flags_clear_all(mm);
|
||||||
if (current->mm) {
|
if (current->mm) {
|
||||||
mm->flags = mmf_init_flags(current->mm->flags);
|
unsigned long flags = __mm_flags_get_word(current->mm);
|
||||||
|
|
||||||
|
__mm_flags_set_word(mm, mmf_init_legacy_flags(flags));
|
||||||
mm->def_flags = current->mm->def_flags & VM_INIT_DEF_MASK;
|
mm->def_flags = current->mm->def_flags & VM_INIT_DEF_MASK;
|
||||||
} else {
|
} else {
|
||||||
mm->flags = default_dump_filter;
|
__mm_flags_set_word(mm, default_dump_filter);
|
||||||
mm->def_flags = 0;
|
mm->def_flags = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue