[PATCH v2 2/7] mm: introduce local state for lazy_mmu sections
Alexander Gordeev
agordeev at linux.ibm.com
Tue Sep 9 21:45:50 AEST 2025
On Tue, Sep 09, 2025 at 12:09:48PM +0200, David Hildenbrand wrote:
> On 09.09.25 11:40, Alexander Gordeev wrote:
> > On Tue, Sep 09, 2025 at 11:07:36AM +0200, David Hildenbrand wrote:
> > > On 08.09.25 09:39, Kevin Brodsky wrote:
> > > > arch_{enter,leave}_lazy_mmu_mode() currently have a stateless API
> > > > (taking and returning no value). This is proving problematic in
> > > > situations where leave() needs to restore some context back to its
> > > > original state (before enter() was called). In particular, this
> > > > makes it difficult to support the nesting of lazy_mmu sections -
> > > > leave() does not know whether the matching enter() call occurred
> > > > while lazy_mmu was already enabled, and whether to disable it or
> > > > not.
> > > >
> > > > This patch gives all architectures the chance to store local state
> > > > while inside a lazy_mmu section by making enter() return some value,
> > > > storing it in a local variable, and having leave() take that value.
> > > > That value is typed lazy_mmu_state_t - each architecture defining
> > > > __HAVE_ARCH_ENTER_LAZY_MMU_MODE is free to define it as it sees fit.
> > > > For now we define it as int everywhere, which is sufficient to
> > > > support nesting.
> > ...
> > > > {
> > > > + lazy_mmu_state_t lazy_mmu_state;
> > > > ...
> > > > - arch_enter_lazy_mmu_mode();
> > > > + lazy_mmu_state = arch_enter_lazy_mmu_mode();
> > > > ...
> > > > - arch_leave_lazy_mmu_mode();
> > > > + arch_leave_lazy_mmu_mode(lazy_mmu_state);
> > > > ...
> > > > }
> > > >
> > > > * In a few cases (e.g. xen_flush_lazy_mmu()), a function knows that
> > > > lazy_mmu is already enabled, and it temporarily disables it by
> > > > calling leave() and then enter() again. Here we want to ensure
> > > > that any operation between the leave() and enter() calls is
> > > > completed immediately; for that reason we pass LAZY_MMU_DEFAULT to
> > > > leave() to fully disable lazy_mmu. enter() will then re-enable it
> > > > - this achieves the expected behaviour, whether nesting occurred
> > > > before that function was called or not.
> > > >
> > > > Note: it is difficult to provide a default definition of
> > > > lazy_mmu_state_t for architectures implementing lazy_mmu, because
> > > > that definition would need to be available in
> > > > arch/x86/include/asm/paravirt_types.h and adding a new generic
> > > > #include there is very tricky due to the existing header soup.
> > >
> > > Yeah, I was wondering about exactly that.
> > >
> > > In particular because LAZY_MMU_DEFAULT etc resides somewehere compeltely
> > > different.
> > >
> > > Which raises the question: is using a new type really of any benefit here?
> > >
> > > Can't we just use an "enum lazy_mmu_state" and call it a day?
> >
> > I could envision something completely different for this type on s390,
> > e.g. a pointer to a per-cpu structure. So I would really ask to stick
> > with the current approach.
>
> Would that integrate well with LAZY_MMU_DEFAULT etc?
Hmm... I though the idea is to use LAZY_MMU_* by architectures that
want to use it - at least that is how I read the description above.
It is only kasan_populate|depopulate_vmalloc_pte() in generic code
that do not follow this pattern, and it looks as a problem to me.
> --
> Cheers
>
> David / dhildenb
Thanks!
More information about the Linuxppc-dev
mailing list