[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 2/7] mm: introduce local state for lazy_mmu sections
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!
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |