On Wed, Jan 08, 2025 at 02:57:21PM +0800, Qi Zheng wrote: > Like other levels of page tables, also use mmu gather mechanism to free > p4d level page table. > > Signed-off-by: Qi Zheng <zhengqi.arch@xxxxxxxxxxxxx> > Originally-by: Peter Zijlstra (Intel) <peterz@xxxxxxxxxxxxx> > Reviewed-by: Kevin Brodsky <kevin.brodsky@xxxxxxx> > Cc: linux-arm-kernel@xxxxxxxxxxxxxxxxxxx > --- > arch/arm64/include/asm/pgalloc.h | 1 - > arch/arm64/include/asm/tlb.h | 14 ++++++++++++++ > 2 files changed, 14 insertions(+), 1 deletion(-) > > diff --git a/arch/arm64/include/asm/pgalloc.h b/arch/arm64/include/asm/pgalloc.h > index 2965f5a7e39e3..1b4509d3382c6 100644 > --- a/arch/arm64/include/asm/pgalloc.h > +++ b/arch/arm64/include/asm/pgalloc.h > @@ -85,7 +85,6 @@ static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgdp, p4d_t *p4dp) > __pgd_populate(pgdp, __pa(p4dp), pgdval); > } > > -#define __p4d_free_tlb(tlb, p4d, addr) p4d_free((tlb)->mm, p4d) > #else > static inline void __pgd_populate(pgd_t *pgdp, phys_addr_t p4dp, pgdval_t prot) > { > diff --git a/arch/arm64/include/asm/tlb.h b/arch/arm64/include/asm/tlb.h > index a947c6e784ed2..445282cde9afb 100644 > --- a/arch/arm64/include/asm/tlb.h > +++ b/arch/arm64/include/asm/tlb.h > @@ -111,4 +111,18 @@ static inline void __pud_free_tlb(struct mmu_gather *tlb, pud_t *pudp, > } > #endif > > +#if CONFIG_PGTABLE_LEVELS > 4 > +static inline void __p4d_free_tlb(struct mmu_gather *tlb, p4d_t *p4dp, > + unsigned long addr) > +{ > + struct ptdesc *ptdesc = virt_to_ptdesc(p4dp); > + > + if (!pgtable_l5_enabled()) > + return; > + > + pagetable_p4d_dtor(ptdesc); > + tlb_remove_ptdesc(tlb, ptdesc); > +} Should we update p4d_free() to call the destructor, too? It looks like it just does free_page() atm. Will