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-7a8364391...@arm.com/
>
>       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/aehksq0zvaujk...@arm.com/

Reply via email to