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/