Re: [PATCH 0/7] Nesting support for lazy MMU mode
From: Kevin Brodsky
Date: Fri Sep 05 2025 - 08:12:48 EST
On 05/09/2025 11:46, Alexander Gordeev wrote:
> On Thu, Sep 04, 2025 at 01:57:29PM +0100, Kevin Brodsky wrote:
>
> Hi Kevin,
>
>> When the lazy MMU mode was introduced eons ago, it wasn't made clear
>> whether such a sequence was legal:
>>
>> arch_enter_lazy_mmu_mode()
>> ...
>> arch_enter_lazy_mmu_mode()
>> ...
>> arch_leave_lazy_mmu_mode()
>> ...
>> arch_leave_lazy_mmu_mode()
> I did not take too deep - sorry if you already answered this.
> Quick question - whether a concern Ryan expressed is addressed
> in general case?
The short answer is yes - it's good that you're asking because I failed
to clarify this in the cover letter!
> https://lore.kernel.org/all/3cad01ea-b704-4156-807e-7a83643917a8@xxxxxxx/
>
> enter_lazy_mmu
> for_each_pte {
> read/modify-write pte
>
> alloc_page
> enter_lazy_mmu
> make page valid
> exit_lazy_mmu
>
> write_to_page
> }
> exit_lazy_mmu
>
> <quote>
> This example only works because lazy_mmu doesn't support nesting. The "make page
> valid" operation is completed by the time of the inner exit_lazy_mmu so that the
> page can be accessed in write_to_page. If nesting was supported, the inner
> exit_lazy_mmu would become a nop and write_to_page would explode.
> </quote>
Further down in the cover letter I refer to the approach Catalin
suggested [4]. This was in fact in response to this concern from Ryan.
The key point is: leave() keeps the lazy MMU mode enabled if it is
nested, but it flushes any batched state *unconditionally*, regardless
of nesting level. See patch 3-6 on the practical implementation of this;
patch 7 also spells it out in the documentation.
Hope that clarifies the situation!
- Kevin
[4] https://lore.kernel.org/all/aEhKSq0zVaUJkomX@xxxxxxx/