On Mon, Dec 30, 2024 at 05:07:41PM +0800, Qi Zheng wrote: > Like PMD and PTE level page table, also add statistics for PUD and P4D > page table. ... > diff --git a/arch/s390/include/asm/tlb.h b/arch/s390/include/asm/tlb.h > index e95b2c8081eb8..b946964afce8e 100644 > --- a/arch/s390/include/asm/tlb.h > +++ b/arch/s390/include/asm/tlb.h > @@ -110,24 +110,6 @@ static inline void pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd, > tlb_remove_ptdesc(tlb, pmd); > } > > -/* > - * p4d_free_tlb frees a pud table and clears the CRSTE for the > - * region second table entry from the tlb. > - * If the mm uses a four level page table the single p4d is freed > - * as the pgd. p4d_free_tlb checks the asce_limit against 8PB > - * to avoid the double free of the p4d in this case. > - */ > -static inline void p4d_free_tlb(struct mmu_gather *tlb, p4d_t *p4d, > - unsigned long address) > -{ > - if (mm_p4d_folded(tlb->mm)) > - return; > - __tlb_adjust_range(tlb, address, PAGE_SIZE); > - tlb->mm->context.flush_mm = 1; > - tlb->freed_tables = 1; > - tlb_remove_ptdesc(tlb, p4d); > -} > - > /* > * pud_free_tlb frees a pud table and clears the CRSTE for the > * region third table entry from the tlb. > @@ -140,11 +122,30 @@ static inline void pud_free_tlb(struct mmu_gather *tlb, pud_t *pud, > { > if (mm_pud_folded(tlb->mm)) > return; > + pagetable_pud_dtor(virt_to_ptdesc(pud)); > tlb->mm->context.flush_mm = 1; > tlb->freed_tables = 1; > tlb->cleared_p4ds = 1; > tlb_remove_ptdesc(tlb, pud); > } > > +/* > + * p4d_free_tlb frees a p4d table and clears the CRSTE for the > + * region second table entry from the tlb. > + * If the mm uses a four level page table the single p4d is freed > + * as the pgd. p4d_free_tlb checks the asce_limit against 8PB > + * to avoid the double free of the p4d in this case. > + */ > +static inline void p4d_free_tlb(struct mmu_gather *tlb, p4d_t *p4d, > + unsigned long address) > +{ > + if (mm_p4d_folded(tlb->mm)) > + return; > + pagetable_p4d_dtor(virt_to_ptdesc(p4d)); > + __tlb_adjust_range(tlb, address, PAGE_SIZE); > + tlb->mm->context.flush_mm = 1; > + tlb->freed_tables = 1; > + tlb_remove_ptdesc(tlb, p4d); > +} I understand that you want to sort p.._free_tlb() routines, but please do not move the code around or make a separate follow-up patch. Thanks!