Re: [PATCH v1 3/4] sparc/mm: Avoid calling arch_enter/leave_lazy_mmu() in set_ptes
From: Andreas Larsson
Date: Mon Mar 03 2025 - 08:40:07 EST
On 2025-03-02 15:55, Ryan Roberts wrote:
> With commit 1a10a44dfc1d ("sparc64: implement the new page table range
> API") set_ptes was added to the sparc architecture. The implementation
> included calling arch_enter/leave_lazy_mmu() calls.
>
> The patch removes the usage of arch_enter/leave_lazy_mmu() since this
> implies nesting of lazy mmu regions which is not supported. Without this
> fix, lazy mmu mode is effectively disabled because we exit the mode
> after the first set_ptes:
>
> remap_pte_range()
> -> arch_enter_lazy_mmu()
> -> set_ptes()
> -> arch_enter_lazy_mmu()
> -> arch_leave_lazy_mmu()
> -> arch_leave_lazy_mmu()
>
> Powerpc suffered the same problem and fixed it in a corresponding way
> with commit 47b8def9358c ("powerpc/mm: Avoid calling
> arch_enter/leave_lazy_mmu() in set_ptes").
>
> Fixes: 1a10a44dfc1d ("sparc64: implement the new page table range API")
> Signed-off-by: Ryan Roberts <ryan.roberts@xxxxxxx>
> ---
> arch/sparc/include/asm/pgtable_64.h | 2 --
> 1 file changed, 2 deletions(-)
>
> diff --git a/arch/sparc/include/asm/pgtable_64.h b/arch/sparc/include/asm/pgtable_64.h
> index 2b7f358762c1..dc28f2c4eee3 100644
> --- a/arch/sparc/include/asm/pgtable_64.h
> +++ b/arch/sparc/include/asm/pgtable_64.h
> @@ -936,7 +936,6 @@ static inline void __set_pte_at(struct mm_struct *mm, unsigned long addr,
> static inline void set_ptes(struct mm_struct *mm, unsigned long addr,
> pte_t *ptep, pte_t pte, unsigned int nr)
> {
> - arch_enter_lazy_mmu_mode();
> for (;;) {
> __set_pte_at(mm, addr, ptep, pte, 0);
> if (--nr == 0)
> @@ -945,7 +944,6 @@ static inline void set_ptes(struct mm_struct *mm, unsigned long addr,
> pte_val(pte) += PAGE_SIZE;
> addr += PAGE_SIZE;
> }
> - arch_leave_lazy_mmu_mode();
> }
> #define set_ptes set_ptes
Acked-by: Andreas Larsson <andreas@xxxxxxxxxxx>
Thanks,
Andreas