Message ID | 3fd48525397b34a64f7c0eb76746da30814dc941.1736317725.git.zhengqi.arch@bytedance.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | move pagetable_*_dtor() to __tlb_remove_table() | expand |
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@bytedance.com> > Originally-by: Peter Zijlstra (Intel) <peterz@infradead.org> > Reviewed-by: Kevin Brodsky <kevin.brodsky@arm.com> > Cc: linux-arm-kernel@lists.infradead.org > --- > 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
Hi Will, On 2025/1/14 00:26, Will Deacon wrote: > 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@bytedance.com> >> Originally-by: Peter Zijlstra (Intel) <peterz@infradead.org> >> Reviewed-by: Kevin Brodsky <kevin.brodsky@arm.com> >> Cc: linux-arm-kernel@lists.infradead.org >> --- >> 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. The patch #3 introduces the generic p4d_free() and lets arm64 to use it. The patch #4 adds the destructor to generic p4d_free(). So IIUC, there is no problem here. Thanks! > > Will
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); +} +#endif + #endif