On 07/01/2025 11:51, Qi Zheng wrote: > [...] > > Author: Qi Zheng <zhengqi.arch@xxxxxxxxxxxxx> > Date: Fri Dec 13 17:13:48 2024 +0800 > > mm: pgtable: completely move pagetable_dtor() to generic > tlb_remove_table() > > For the generic tlb_remove_table(), it is implemented in the > following two > forms: > > 1) CONFIG_MMU_GATHER_TABLE_FREE is enabled > > tlb_remove_table > --> generic __tlb_remove_table() > > 2) CONFIG_MMU_GATHER_TABLE_FREE is disabled > > tlb_remove_table > --> tlb_remove_page > > For case 1), the pagetable_dtor() has already been moved to generic > __tlb_remove_table(). > > For case 2), now only arm will call > tlb_remove_table()/tlb_remove_ptdesc() > when CONFIG_MMU_GATHER_TABLE_FREE is disabled. Let's move > pagetable_dtor() > completely to generic tlb_remove_table(), so that the > architectures can > follow more easily. > > Signed-off-by: Qi Zheng <zhengqi.arch@xxxxxxxxxxxxx> > > diff --git a/arch/arm/include/asm/tlb.h b/arch/arm/include/asm/tlb.h > index b8eebdb598631..ea4fbe7b17f6f 100644 > --- a/arch/arm/include/asm/tlb.h > +++ b/arch/arm/include/asm/tlb.h > @@ -34,10 +34,6 @@ __pte_free_tlb(struct mmu_gather *tlb, pgtable_t > pte, unsigned long addr) > { > struct ptdesc *ptdesc = page_ptdesc(pte); > > -#ifndef CONFIG_MMU_GATHER_TABLE_FREE > - pagetable_dtor(ptdesc); > -#endif I guess this hunk will disappear since this call isn't present to start with. > - > #ifndef CONFIG_ARM_LPAE > /* > * With the classic ARM MMU, a pte page has two corresponding pmd > diff --git a/include/asm-generic/tlb.h b/include/asm-generic/tlb.h > index 69de47c7ef3c5..53ae7748f555b 100644 > --- a/include/asm-generic/tlb.h > +++ b/include/asm-generic/tlb.h > @@ -220,14 +220,20 @@ static inline void __tlb_remove_table(void *table) > > extern void tlb_remove_table(struct mmu_gather *tlb, void *table); > > -#else /* !CONFIG_MMU_GATHER_HAVE_TABLE_FREE */ > +#else /* !CONFIG_MMU_GATHER_TABLE_FREE */ Good catch! > > +static inline void tlb_remove_page(struct mmu_gather *tlb, struct > page *page); Nit: might be better to move the declaration up, e.g. above #ifdef CONFIG_MMU_GATHER_TABLE_FREE. > /* > * Without MMU_GATHER_TABLE_FREE the architecture is assumed to have > page based > * page directories and we can use the normal page batching to free > them. > */ > -#define tlb_remove_table(tlb, page) tlb_remove_page((tlb), (page)) > +static inline void tlb_remove_table(struct mmu_gather *tlb, void *table) > +{ > + struct page *page = (struct page *)table; > > + pagetable_dtor(page_ptdesc(page)); > + tlb_remove_page(tlb, page); > +} > #endif /* CONFIG_MMU_GATHER_TABLE_FREE */ > > #ifdef CONFIG_MMU_GATHER_RCU_TABLE_FREE Looks good to me otherwise. - Kevin