[PATCH 05/12] mm: enable MMU_GATHER_RCU_TABLE_FREE for arc, microblaze, xtensa

Lorenzo Stoakes (ARM) ljs at kernel.org
Tue Sep 8 04:28:51 PDT 2026


On Mon, Sep 07, 2026 at 02:07:37PM -0700, Suren Baghdasaryan wrote:
> On Tue, Sep 1, 2026 at 4:06 AM Lorenzo Stoakes (ARM) <ljs at kernel.org> wrote:
> >
> > Each of these architectures directly free page tables without routing these
> > changes through tlb_remove_ptdesc().
> >
> > The use of tlb_remove_ptdesc() is required for
> > CONFIG_MMU_GATHER_RCU_TABLE_FREE to correctly free page tables under RCU,
> > so simply update these architectures to use these functions.
> >
> > Since none of the architectures share page tables or do anything unusual,
> > nothing complicated is required here.
> >
> > Therefore this is simply a mechanical change - convert __pud_free_tlb(),
> > __pmd_free_tlb() and __pte_free_tlb() to use tlb_remove_ptdesc() as
> > required.
> >
> > At the point this is in place, all mmu_gather page table freeing is
> > performed under RCU, and thus MMU_GATHER_RCU_TABLE_FREE is selected for
> > each architecture.
> >
> > This forms part of an overall effort to switch every architecture to this
> > mode.
> >
> > Signed-off-by: Lorenzo Stoakes (ARM) <ljs at kernel.org>
> > ---
> >  arch/arc/Kconfig                      | 1 +
> >  arch/arc/include/asm/pgalloc.h        | 6 +++---
> >  arch/microblaze/Kconfig               | 1 +
> >  arch/microblaze/include/asm/pgalloc.h | 2 +-
> >  arch/xtensa/Kconfig                   | 1 +
> >  arch/xtensa/include/asm/tlb.h         | 2 +-
> >  6 files changed, 8 insertions(+), 5 deletions(-)
> >
> > diff --git a/arch/arc/Kconfig b/arch/arc/Kconfig
> > index 2ed7186c81c5..7a7542b61823 100644
> > --- a/arch/arc/Kconfig
> > +++ b/arch/arc/Kconfig
> > @@ -47,6 +47,7 @@ config ARC
> >         select HAVE_SYSCALL_TRACEPOINTS
> >         select IRQ_DOMAIN
> >         select LOCK_MM_AND_FIND_VMA
> > +       select MMU_GATHER_RCU_TABLE_FREE
> >         select MODULES_USE_ELF_RELA
> >         select OF
> >         select OF_EARLY_FLATTREE
> > diff --git a/arch/arc/include/asm/pgalloc.h b/arch/arc/include/asm/pgalloc.h
> > index dfae070fe8d5..9b6c37f92e97 100644
> > --- a/arch/arc/include/asm/pgalloc.h
> > +++ b/arch/arc/include/asm/pgalloc.h
> > @@ -72,7 +72,7 @@ static inline void p4d_populate(struct mm_struct *mm, p4d_t *p4dp, pud_t *pudp)
> >         set_p4d(p4dp, __p4d((unsigned long)pudp));
> >  }
> >
> > -#define __pud_free_tlb(tlb, pmd, addr)  pud_free((tlb)->mm, pmd)
> > +#define __pud_free_tlb(tlb, pmd, addr)  tlb_remove_ptdesc((tlb), virt_to_ptdesc(pmd))
> >
> >  #endif
> >
> > @@ -83,10 +83,10 @@ static inline void pud_populate(struct mm_struct *mm, pud_t *pudp, pmd_t *pmdp)
> >         set_pud(pudp, __pud((unsigned long)pmdp));
> >  }
> >
> > -#define __pmd_free_tlb(tlb, pmd, addr)  pmd_free((tlb)->mm, pmd)
> > +#define __pmd_free_tlb(tlb, pmd, addr)  tlb_remove_ptdesc((tlb), virt_to_ptdesc(pmd))
> >
> >  #endif
> >
> > -#define __pte_free_tlb(tlb, pte, addr)  pte_free((tlb)->mm, pte)
> > +#define __pte_free_tlb(tlb, pte, addr)  tlb_remove_ptdesc((tlb), page_ptdesc(pte))
> >
> >  #endif /* _ASM_ARC_PGALLOC_H */
> > diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig
> > index 484ebb3baedf..af7e821e96c1 100644
> > --- a/arch/microblaze/Kconfig
> > +++ b/arch/microblaze/Kconfig
> > @@ -41,6 +41,7 @@ config MICROBLAZE
> >         select PCI_SYSCALL if PCI
> >         select CPU_NO_EFFICIENT_FFS
> >         select MMU_GATHER_NO_RANGE
> > +       select MMU_GATHER_RCU_TABLE_FREE
> >         select SPARSE_IRQ
> >         select ZONE_DMA
> >         select TRACE_IRQFLAGS_SUPPORT
> > diff --git a/arch/microblaze/include/asm/pgalloc.h b/arch/microblaze/include/asm/pgalloc.h
> > index 084a8a0dc239..ffee6a009219 100644
> > --- a/arch/microblaze/include/asm/pgalloc.h
> > +++ b/arch/microblaze/include/asm/pgalloc.h
> > @@ -25,7 +25,7 @@ extern void __bad_pte(pmd_t *pmd);
> >
> >  extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm);
> >
> > -#define __pte_free_tlb(tlb, pte, addr) pte_free((tlb)->mm, (pte))
> > +#define __pte_free_tlb(tlb, pte, addr) tlb_remove_ptdesc((tlb), page_ptdesc(pte))
> >
> >  #define pmd_populate(mm, pmd, pte) \
> >                         (pmd_val(*(pmd)) = (unsigned long)page_address(pte))
> > diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig
> > index f2f9cd9cde50..33c4caee30e2 100644
> > --- a/arch/xtensa/Kconfig
> > +++ b/arch/xtensa/Kconfig
> > @@ -55,6 +55,7 @@ config XTENSA
> >         select HAVE_VIRT_CPU_ACCOUNTING_GEN
> >         select IRQ_DOMAIN
> >         select LOCK_MM_AND_FIND_VMA
> > +       select MMU_GATHER_RCU_TABLE_FREE if MMU
>
> And MMU is required because NOMMU does not perform mmu_gather
> operations, same as in the previous patch? If so, maybe make a note of
> it in the changelog?

Right yup. Will update!

>
> >         select MODULES_USE_ELF_RELA
> >         select PERF_USE_VMALLOC
> >         select TRACE_IRQFLAGS_SUPPORT
> > diff --git a/arch/xtensa/include/asm/tlb.h b/arch/xtensa/include/asm/tlb.h
> > index 8c3ceb427018..6fb7b78154f6 100644
> > --- a/arch/xtensa/include/asm/tlb.h
> > +++ b/arch/xtensa/include/asm/tlb.h
> > @@ -16,7 +16,7 @@
> >
> >  #include <asm-generic/tlb.h>
> >
> > -#define __pte_free_tlb(tlb, pte, address)      pte_free((tlb)->mm, pte)
> > +#define __pte_free_tlb(tlb, pte, address)      tlb_remove_ptdesc((tlb), page_ptdesc(pte))
> >
> >  void check_tlb_sanity(void);
> >
> >
> > --
> > 2.55.0
> >

--
Cheers, Lorenzo



More information about the linux-riscv mailing list