From: Qi Zheng <zhengqi.arch@bytedance.com>
On a 64-bit system, madvise(MADV_DONTNEED) may cause a large number of
empty PTE page table pages (such as 100GB+). To resolve this problem,
first enable MMU_GATHER_RCU_TABLE_FREE to prepare for enabling the
PT_RECLAIM feature, which resolves this problem.
Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com>
Cc: Huacai Chen <chenhuacai@kernel.org>
Cc: WANG Xuerui <kernel@xen0n.name>
---
arch/loongarch/Kconfig | 1 +
arch/loongarch/include/asm/pgalloc.h | 6 ++++--
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/arch/loongarch/Kconfig b/arch/loongarch/Kconfig
index 5b1116733d881..3bf2f2a9cd647 100644
--- a/arch/loongarch/Kconfig
+++ b/arch/loongarch/Kconfig
@@ -210,6 +210,7 @@ config LOONGARCH
select USER_STACKTRACE_SUPPORT
select VDSO_GETRANDOM
select ZONE_DMA32
+ select MMU_GATHER_RCU_TABLE_FREE
config 32BIT
bool
diff --git a/arch/loongarch/include/asm/pgalloc.h b/arch/loongarch/include/asm/pgalloc.h
index 1c63a9d9a6d35..0539d04bf1525 100644
--- a/arch/loongarch/include/asm/pgalloc.h
+++ b/arch/loongarch/include/asm/pgalloc.h
@@ -79,7 +79,8 @@ static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
return pmd;
}
-#define __pmd_free_tlb(tlb, x, addr) pmd_free((tlb)->mm, x)
+#define __pmd_free_tlb(tlb, x, addr) \
+ tlb_remove_ptdesc((tlb), virt_to_ptdesc(x))
#endif
@@ -99,7 +100,8 @@ static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long address)
return pud;
}
-#define __pud_free_tlb(tlb, x, addr) pud_free((tlb)->mm, x)
+#define __pud_free_tlb(tlb, x, addr) \
+ tlb_remove_ptdesc((tlb), virt_to_ptdesc(x))
#endif /* __PAGETABLE_PUD_FOLDED */
--
2.20.1
Hi, Qi Zheng, We usually use LoongArch rather than loongarch, but if you want to keep consistency for all patches, just do it. On Fri, Nov 14, 2025 at 7:13 PM Qi Zheng <qi.zheng@linux.dev> wrote: > > From: Qi Zheng <zhengqi.arch@bytedance.com> > > On a 64-bit system, madvise(MADV_DONTNEED) may cause a large number of > empty PTE page table pages (such as 100GB+). To resolve this problem, > first enable MMU_GATHER_RCU_TABLE_FREE to prepare for enabling the > PT_RECLAIM feature, which resolves this problem. > > Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com> > Cc: Huacai Chen <chenhuacai@kernel.org> > Cc: WANG Xuerui <kernel@xen0n.name> > --- > arch/loongarch/Kconfig | 1 + > arch/loongarch/include/asm/pgalloc.h | 6 ++++-- > 2 files changed, 5 insertions(+), 2 deletions(-) > > diff --git a/arch/loongarch/Kconfig b/arch/loongarch/Kconfig > index 5b1116733d881..3bf2f2a9cd647 100644 > --- a/arch/loongarch/Kconfig > +++ b/arch/loongarch/Kconfig > @@ -210,6 +210,7 @@ config LOONGARCH > select USER_STACKTRACE_SUPPORT > select VDSO_GETRANDOM > select ZONE_DMA32 > + select MMU_GATHER_RCU_TABLE_FREE Please use alpha-betical order. > > config 32BIT > bool > diff --git a/arch/loongarch/include/asm/pgalloc.h b/arch/loongarch/include/asm/pgalloc.h > index 1c63a9d9a6d35..0539d04bf1525 100644 > --- a/arch/loongarch/include/asm/pgalloc.h > +++ b/arch/loongarch/include/asm/pgalloc.h > @@ -79,7 +79,8 @@ static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address) > return pmd; > } > > -#define __pmd_free_tlb(tlb, x, addr) pmd_free((tlb)->mm, x) > +#define __pmd_free_tlb(tlb, x, addr) \ > + tlb_remove_ptdesc((tlb), virt_to_ptdesc(x)) I think we can define it in one line. > > #endif > > @@ -99,7 +100,8 @@ static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long address) > return pud; > } > > -#define __pud_free_tlb(tlb, x, addr) pud_free((tlb)->mm, x) > +#define __pud_free_tlb(tlb, x, addr) \ > + tlb_remove_ptdesc((tlb), virt_to_ptdesc(x)) The same. Other patches have the same problem. Huacai > > #endif /* __PAGETABLE_PUD_FOLDED */ > > -- > 2.20.1 >
Hi Huacai, On 11/14/25 10:17 PM, Huacai Chen wrote: > Hi, Qi Zheng, [...] >> >> -#define __pmd_free_tlb(tlb, x, addr) pmd_free((tlb)->mm, x) >> +#define __pmd_free_tlb(tlb, x, addr) \ >> + tlb_remove_ptdesc((tlb), virt_to_ptdesc(x)) > I think we can define it in one line. Do we need to change __pte_free_tlb() to a single-line format as well? Thanks, Qi >>
On Mon, Nov 17, 2025 at 2:42 PM Qi Zheng <qi.zheng@linux.dev> wrote: > > Hi Huacai, > > On 11/14/25 10:17 PM, Huacai Chen wrote: > > Hi, Qi Zheng, > > [...] > > >> > >> -#define __pmd_free_tlb(tlb, x, addr) pmd_free((tlb)->mm, x) > >> +#define __pmd_free_tlb(tlb, x, addr) \ > >> + tlb_remove_ptdesc((tlb), virt_to_ptdesc(x)) > > I think we can define it in one line. > > Do we need to change __pte_free_tlb() to a single-line format > as well? Yes, there is no 80 columns limit now. Huacai > > Thanks, > Qi > > > >> > >
Hi Huacai, On 11/14/25 10:17 PM, Huacai Chen wrote: > Hi, Qi Zheng, > > We usually use LoongArch rather than loongarch, but if you want to > keep consistency for all patches, just do it. OK, will change to use LoongArch. > > On Fri, Nov 14, 2025 at 7:13 PM Qi Zheng <qi.zheng@linux.dev> wrote: >> >> From: Qi Zheng <zhengqi.arch@bytedance.com> >> >> On a 64-bit system, madvise(MADV_DONTNEED) may cause a large number of >> empty PTE page table pages (such as 100GB+). To resolve this problem, >> first enable MMU_GATHER_RCU_TABLE_FREE to prepare for enabling the >> PT_RECLAIM feature, which resolves this problem. >> >> Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com> >> Cc: Huacai Chen <chenhuacai@kernel.org> >> Cc: WANG Xuerui <kernel@xen0n.name> >> --- >> arch/loongarch/Kconfig | 1 + >> arch/loongarch/include/asm/pgalloc.h | 6 ++++-- >> 2 files changed, 5 insertions(+), 2 deletions(-) >> >> diff --git a/arch/loongarch/Kconfig b/arch/loongarch/Kconfig >> index 5b1116733d881..3bf2f2a9cd647 100644 >> --- a/arch/loongarch/Kconfig >> +++ b/arch/loongarch/Kconfig >> @@ -210,6 +210,7 @@ config LOONGARCH >> select USER_STACKTRACE_SUPPORT >> select VDSO_GETRANDOM >> select ZONE_DMA32 >> + select MMU_GATHER_RCU_TABLE_FREE > Please use alpha-betical order. OK, will do. > >> >> config 32BIT >> bool >> diff --git a/arch/loongarch/include/asm/pgalloc.h b/arch/loongarch/include/asm/pgalloc.h >> index 1c63a9d9a6d35..0539d04bf1525 100644 >> --- a/arch/loongarch/include/asm/pgalloc.h >> +++ b/arch/loongarch/include/asm/pgalloc.h >> @@ -79,7 +79,8 @@ static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address) >> return pmd; >> } >> >> -#define __pmd_free_tlb(tlb, x, addr) pmd_free((tlb)->mm, x) >> +#define __pmd_free_tlb(tlb, x, addr) \ >> + tlb_remove_ptdesc((tlb), virt_to_ptdesc(x)) > I think we can define it in one line. will do. > >> >> #endif >> >> @@ -99,7 +100,8 @@ static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long address) >> return pud; >> } >> >> -#define __pud_free_tlb(tlb, x, addr) pud_free((tlb)->mm, x) >> +#define __pud_free_tlb(tlb, x, addr) \ >> + tlb_remove_ptdesc((tlb), virt_to_ptdesc(x)) > The same. > > Other patches have the same problem. Got it, will convert them all to the one-line type. Thanks, Qi > > Huacai > >> >> #endif /* __PAGETABLE_PUD_FOLDED */ >> >> -- >> 2.20.1 >>
© 2016 - 2026 Red Hat, Inc.