Re: [PATCH v2 2/7] mm: introduce local state for lazy_mmu sections

Alexander Gordeev
2025-09-09T09:41:29Z

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.

> --
> Cheers
>
> David / dhildenb

Thanks!