From: Qi Zheng <zhengqi.arch@bytedance.com>
For architectures that define __HAVE_ARCH_TLB_REMOVE_TABLE, the page
tables at the pmd/pud level are generally not of struct ptdesc type, and
do not have pt_rcu_head member, thus these architectures cannot support
PT_RECLAIM.
In preparation for enabling PT_RECLAIM on more architectures, convert
__HAVE_ARCH_TLB_REMOVE_TABLE to CONFIG_HAVE_ARCH_TLB_REMOVE_TABLE config,
so that we can make conditional judgments in Kconfig.
Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com>
---
arch/powerpc/Kconfig | 1 +
arch/powerpc/include/asm/tlb.h | 1 -
arch/sparc/Kconfig | 1 +
arch/sparc/include/asm/tlb_64.h | 1 -
include/asm-generic/tlb.h | 2 +-
mm/Kconfig | 3 +++
6 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index 9537a61ebae02..b47aa8fd62742 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -304,6 +304,7 @@ config PPC
select LOCK_MM_AND_FIND_VMA
select MMU_GATHER_PAGE_SIZE
select MMU_GATHER_RCU_TABLE_FREE
+ select HAVE_ARCH_TLB_REMOVE_TABLE
select MMU_GATHER_MERGE_VMAS
select MMU_LAZY_TLB_SHOOTDOWN if PPC_BOOK3S_64
select MODULES_USE_ELF_RELA
diff --git a/arch/powerpc/include/asm/tlb.h b/arch/powerpc/include/asm/tlb.h
index 2058e8d3e0138..1ca7d4c4b90db 100644
--- a/arch/powerpc/include/asm/tlb.h
+++ b/arch/powerpc/include/asm/tlb.h
@@ -37,7 +37,6 @@ extern void tlb_flush(struct mmu_gather *tlb);
*/
#define tlb_needs_table_invalidate() radix_enabled()
-#define __HAVE_ARCH_TLB_REMOVE_TABLE
/* Get the generic bits... */
#include <asm-generic/tlb.h>
diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig
index a630d373e6453..25fa2908d6152 100644
--- a/arch/sparc/Kconfig
+++ b/arch/sparc/Kconfig
@@ -74,6 +74,7 @@ config SPARC64
select HAVE_KRETPROBES
select HAVE_KPROBES
select MMU_GATHER_RCU_TABLE_FREE if SMP
+ select HAVE_ARCH_TLB_REMOVE_TABLE if SMP
select MMU_GATHER_MERGE_VMAS
select MMU_GATHER_NO_FLUSH_CACHE
select HAVE_ARCH_TRANSPARENT_HUGEPAGE
diff --git a/arch/sparc/include/asm/tlb_64.h b/arch/sparc/include/asm/tlb_64.h
index 1a6e694418e39..3037187482db7 100644
--- a/arch/sparc/include/asm/tlb_64.h
+++ b/arch/sparc/include/asm/tlb_64.h
@@ -33,7 +33,6 @@ void flush_tlb_pending(void);
#define tlb_needs_table_invalidate() (false)
#endif
-#define __HAVE_ARCH_TLB_REMOVE_TABLE
#include <asm-generic/tlb.h>
#endif /* _SPARC64_TLB_H */
diff --git a/include/asm-generic/tlb.h b/include/asm-generic/tlb.h
index 4d679d2a206b4..3427b8036ba33 100644
--- a/include/asm-generic/tlb.h
+++ b/include/asm-generic/tlb.h
@@ -213,7 +213,7 @@ struct mmu_table_batch {
#define MAX_TABLE_BATCH \
((PAGE_SIZE - sizeof(struct mmu_table_batch)) / sizeof(void *))
-#ifndef __HAVE_ARCH_TLB_REMOVE_TABLE
+#ifndef CONFIG_HAVE_ARCH_TLB_REMOVE_TABLE
static inline void __tlb_remove_table(void *table)
{
struct ptdesc *ptdesc = (struct ptdesc *)table;
diff --git a/mm/Kconfig b/mm/Kconfig
index a992f2203eb91..456e9eaedca39 100644
--- a/mm/Kconfig
+++ b/mm/Kconfig
@@ -1451,6 +1451,9 @@ config ARCH_HAS_USER_SHADOW_STACK
The architecture has hardware support for userspace shadow call
stacks (eg, x86 CET, arm64 GCS or RISC-V Zicfiss).
+config HAVE_ARCH_TLB_REMOVE_TABLE
+ def_bool n
+
config ARCH_SUPPORTS_PT_RECLAIM
def_bool n
--
2.20.1
On 1/27/26 13:13, Qi Zheng wrote: > From: Qi Zheng <zhengqi.arch@bytedance.com> > > For architectures that define __HAVE_ARCH_TLB_REMOVE_TABLE, the page > tables at the pmd/pud level are generally not of struct ptdesc type, and > do not have pt_rcu_head member, thus these architectures cannot support > PT_RECLAIM. > > In preparation for enabling PT_RECLAIM on more architectures, convert > __HAVE_ARCH_TLB_REMOVE_TABLE to CONFIG_HAVE_ARCH_TLB_REMOVE_TABLE config, > so that we can make conditional judgments in Kconfig. > > Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com> > --- > arch/powerpc/Kconfig | 1 + > arch/powerpc/include/asm/tlb.h | 1 - > arch/sparc/Kconfig | 1 + > arch/sparc/include/asm/tlb_64.h | 1 - > include/asm-generic/tlb.h | 2 +- > mm/Kconfig | 3 +++ > 6 files changed, 6 insertions(+), 3 deletions(-) > > diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig > index 9537a61ebae02..b47aa8fd62742 100644 > --- a/arch/powerpc/Kconfig > +++ b/arch/powerpc/Kconfig > @@ -304,6 +304,7 @@ config PPC > select LOCK_MM_AND_FIND_VMA > select MMU_GATHER_PAGE_SIZE > select MMU_GATHER_RCU_TABLE_FREE > + select HAVE_ARCH_TLB_REMOVE_TABLE > select MMU_GATHER_MERGE_VMAS > select MMU_LAZY_TLB_SHOOTDOWN if PPC_BOOK3S_64 > select MODULES_USE_ELF_RELA > diff --git a/arch/powerpc/include/asm/tlb.h b/arch/powerpc/include/asm/tlb.h > index 2058e8d3e0138..1ca7d4c4b90db 100644 > --- a/arch/powerpc/include/asm/tlb.h > +++ b/arch/powerpc/include/asm/tlb.h > @@ -37,7 +37,6 @@ extern void tlb_flush(struct mmu_gather *tlb); > */ > #define tlb_needs_table_invalidate() radix_enabled() > > -#define __HAVE_ARCH_TLB_REMOVE_TABLE > /* Get the generic bits... */ > #include <asm-generic/tlb.h> > > diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig > index a630d373e6453..25fa2908d6152 100644 > --- a/arch/sparc/Kconfig > +++ b/arch/sparc/Kconfig > @@ -74,6 +74,7 @@ config SPARC64 > select HAVE_KRETPROBES > select HAVE_KPROBES > select MMU_GATHER_RCU_TABLE_FREE if SMP > + select HAVE_ARCH_TLB_REMOVE_TABLE if SMP Why the SMP? At least in tlb_64.h, it was not protected by SMP IIUC. Apart from that LGTM. -- Cheers, David
On 2/6/26 7:06 PM, David Hildenbrand (Arm) wrote: > On 1/27/26 13:13, Qi Zheng wrote: >> From: Qi Zheng <zhengqi.arch@bytedance.com> >> >> For architectures that define __HAVE_ARCH_TLB_REMOVE_TABLE, the page >> tables at the pmd/pud level are generally not of struct ptdesc type, and >> do not have pt_rcu_head member, thus these architectures cannot support >> PT_RECLAIM. >> >> In preparation for enabling PT_RECLAIM on more architectures, convert >> __HAVE_ARCH_TLB_REMOVE_TABLE to CONFIG_HAVE_ARCH_TLB_REMOVE_TABLE config, >> so that we can make conditional judgments in Kconfig. >> >> Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com> >> --- >> arch/powerpc/Kconfig | 1 + >> arch/powerpc/include/asm/tlb.h | 1 - >> arch/sparc/Kconfig | 1 + >> arch/sparc/include/asm/tlb_64.h | 1 - >> include/asm-generic/tlb.h | 2 +- >> mm/Kconfig | 3 +++ >> 6 files changed, 6 insertions(+), 3 deletions(-) >> >> diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig >> index 9537a61ebae02..b47aa8fd62742 100644 >> --- a/arch/powerpc/Kconfig >> +++ b/arch/powerpc/Kconfig >> @@ -304,6 +304,7 @@ config PPC >> select LOCK_MM_AND_FIND_VMA >> select MMU_GATHER_PAGE_SIZE >> select MMU_GATHER_RCU_TABLE_FREE >> + select HAVE_ARCH_TLB_REMOVE_TABLE >> select MMU_GATHER_MERGE_VMAS >> select MMU_LAZY_TLB_SHOOTDOWN if PPC_BOOK3S_64 >> select MODULES_USE_ELF_RELA >> diff --git a/arch/powerpc/include/asm/tlb.h b/arch/powerpc/include/ >> asm/tlb.h >> index 2058e8d3e0138..1ca7d4c4b90db 100644 >> --- a/arch/powerpc/include/asm/tlb.h >> +++ b/arch/powerpc/include/asm/tlb.h >> @@ -37,7 +37,6 @@ extern void tlb_flush(struct mmu_gather *tlb); >> */ >> #define tlb_needs_table_invalidate() radix_enabled() >> -#define __HAVE_ARCH_TLB_REMOVE_TABLE >> /* Get the generic bits... */ >> #include <asm-generic/tlb.h> >> diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig >> index a630d373e6453..25fa2908d6152 100644 >> --- a/arch/sparc/Kconfig >> +++ b/arch/sparc/Kconfig >> @@ -74,6 +74,7 @@ config SPARC64 >> select HAVE_KRETPROBES >> select HAVE_KPROBES >> select MMU_GATHER_RCU_TABLE_FREE if SMP >> + select HAVE_ARCH_TLB_REMOVE_TABLE if SMP > > Why the SMP? At least in tlb_64.h, it was not protected by SMP IIUC. Ah, It's just simply aligned with the MMU_GATHER_RCU_TABLE_FREE above. > > Apart from that LGTM. Thanks! >
On 2/6/26 12:13, Qi Zheng wrote: > > > On 2/6/26 7:06 PM, David Hildenbrand (Arm) wrote: >> On 1/27/26 13:13, Qi Zheng wrote: >>> From: Qi Zheng <zhengqi.arch@bytedance.com> >>> >>> For architectures that define __HAVE_ARCH_TLB_REMOVE_TABLE, the page >>> tables at the pmd/pud level are generally not of struct ptdesc type, and >>> do not have pt_rcu_head member, thus these architectures cannot support >>> PT_RECLAIM. >>> >>> In preparation for enabling PT_RECLAIM on more architectures, convert >>> __HAVE_ARCH_TLB_REMOVE_TABLE to CONFIG_HAVE_ARCH_TLB_REMOVE_TABLE >>> config, >>> so that we can make conditional judgments in Kconfig. >>> >>> Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com> >>> --- >>> arch/powerpc/Kconfig | 1 + >>> arch/powerpc/include/asm/tlb.h | 1 - >>> arch/sparc/Kconfig | 1 + >>> arch/sparc/include/asm/tlb_64.h | 1 - >>> include/asm-generic/tlb.h | 2 +- >>> mm/Kconfig | 3 +++ >>> 6 files changed, 6 insertions(+), 3 deletions(-) >>> >>> diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig >>> index 9537a61ebae02..b47aa8fd62742 100644 >>> --- a/arch/powerpc/Kconfig >>> +++ b/arch/powerpc/Kconfig >>> @@ -304,6 +304,7 @@ config PPC >>> select LOCK_MM_AND_FIND_VMA >>> select MMU_GATHER_PAGE_SIZE >>> select MMU_GATHER_RCU_TABLE_FREE >>> + select HAVE_ARCH_TLB_REMOVE_TABLE >>> select MMU_GATHER_MERGE_VMAS >>> select MMU_LAZY_TLB_SHOOTDOWN if PPC_BOOK3S_64 >>> select MODULES_USE_ELF_RELA >>> diff --git a/arch/powerpc/include/asm/tlb.h b/arch/powerpc/include/ >>> asm/tlb.h >>> index 2058e8d3e0138..1ca7d4c4b90db 100644 >>> --- a/arch/powerpc/include/asm/tlb.h >>> +++ b/arch/powerpc/include/asm/tlb.h >>> @@ -37,7 +37,6 @@ extern void tlb_flush(struct mmu_gather *tlb); >>> */ >>> #define tlb_needs_table_invalidate() radix_enabled() >>> -#define __HAVE_ARCH_TLB_REMOVE_TABLE >>> /* Get the generic bits... */ >>> #include <asm-generic/tlb.h> >>> diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig >>> index a630d373e6453..25fa2908d6152 100644 >>> --- a/arch/sparc/Kconfig >>> +++ b/arch/sparc/Kconfig >>> @@ -74,6 +74,7 @@ config SPARC64 >>> select HAVE_KRETPROBES >>> select HAVE_KPROBES >>> select MMU_GATHER_RCU_TABLE_FREE if SMP >>> + select HAVE_ARCH_TLB_REMOVE_TABLE if SMP >> >> Why the SMP? At least in tlb_64.h, it was not protected by SMP IIUC. > > Ah, It's just simply aligned with the MMU_GATHER_RCU_TABLE_FREE above. But does that work as expected for !SMP? -- Cheers, David
On 2/6/26 7:45 PM, David Hildenbrand (Arm) wrote:
> On 2/6/26 12:13, Qi Zheng wrote:
>>
>>
>> On 2/6/26 7:06 PM, David Hildenbrand (Arm) wrote:
>>> On 1/27/26 13:13, Qi Zheng wrote:
>>>> From: Qi Zheng <zhengqi.arch@bytedance.com>
>>>>
>>>> For architectures that define __HAVE_ARCH_TLB_REMOVE_TABLE, the page
>>>> tables at the pmd/pud level are generally not of struct ptdesc type,
>>>> and
>>>> do not have pt_rcu_head member, thus these architectures cannot support
>>>> PT_RECLAIM.
>>>>
>>>> In preparation for enabling PT_RECLAIM on more architectures, convert
>>>> __HAVE_ARCH_TLB_REMOVE_TABLE to CONFIG_HAVE_ARCH_TLB_REMOVE_TABLE
>>>> config,
>>>> so that we can make conditional judgments in Kconfig.
>>>>
>>>> Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com>
>>>> ---
>>>> arch/powerpc/Kconfig | 1 +
>>>> arch/powerpc/include/asm/tlb.h | 1 -
>>>> arch/sparc/Kconfig | 1 +
>>>> arch/sparc/include/asm/tlb_64.h | 1 -
>>>> include/asm-generic/tlb.h | 2 +-
>>>> mm/Kconfig | 3 +++
>>>> 6 files changed, 6 insertions(+), 3 deletions(-)
>>>>
>>>> diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
>>>> index 9537a61ebae02..b47aa8fd62742 100644
>>>> --- a/arch/powerpc/Kconfig
>>>> +++ b/arch/powerpc/Kconfig
>>>> @@ -304,6 +304,7 @@ config PPC
>>>> select LOCK_MM_AND_FIND_VMA
>>>> select MMU_GATHER_PAGE_SIZE
>>>> select MMU_GATHER_RCU_TABLE_FREE
>>>> + select HAVE_ARCH_TLB_REMOVE_TABLE
>>>> select MMU_GATHER_MERGE_VMAS
>>>> select MMU_LAZY_TLB_SHOOTDOWN if PPC_BOOK3S_64
>>>> select MODULES_USE_ELF_RELA
>>>> diff --git a/arch/powerpc/include/asm/tlb.h b/arch/powerpc/include/
>>>> asm/tlb.h
>>>> index 2058e8d3e0138..1ca7d4c4b90db 100644
>>>> --- a/arch/powerpc/include/asm/tlb.h
>>>> +++ b/arch/powerpc/include/asm/tlb.h
>>>> @@ -37,7 +37,6 @@ extern void tlb_flush(struct mmu_gather *tlb);
>>>> */
>>>> #define tlb_needs_table_invalidate() radix_enabled()
>>>> -#define __HAVE_ARCH_TLB_REMOVE_TABLE
>>>> /* Get the generic bits... */
>>>> #include <asm-generic/tlb.h>
>>>> diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig
>>>> index a630d373e6453..25fa2908d6152 100644
>>>> --- a/arch/sparc/Kconfig
>>>> +++ b/arch/sparc/Kconfig
>>>> @@ -74,6 +74,7 @@ config SPARC64
>>>> select HAVE_KRETPROBES
>>>> select HAVE_KPROBES
>>>> select MMU_GATHER_RCU_TABLE_FREE if SMP
>>>> + select HAVE_ARCH_TLB_REMOVE_TABLE if SMP
>>>
>>> Why the SMP? At least in tlb_64.h, it was not protected by SMP IIUC.
>>
>> Ah, It's just simply aligned with the MMU_GATHER_RCU_TABLE_FREE above.
>
> But does that work as expected for !SMP?
In the case of !SMP, tlb_remove_table() will not be called:
static inline void pgtable_free_tlb(struct mmu_gather *tlb, void *table,
bool is_page)
{
pgtable_free(table, is_page);
}
so I think it's okay to only select it in case of SMP.
>
On 2/6/26 12:58, Qi Zheng wrote:
>
>
> On 2/6/26 7:45 PM, David Hildenbrand (Arm) wrote:
>> On 2/6/26 12:13, Qi Zheng wrote:
>>>
>>>
>>>
>>> Ah, It's just simply aligned with the MMU_GATHER_RCU_TABLE_FREE above.
>>
>> But does that work as expected for !SMP?
>
> In the case of !SMP, tlb_remove_table() will not be called:
>
> static inline void pgtable_free_tlb(struct mmu_gather *tlb, void *table,
> bool is_page)
> {
> pgtable_free(table, is_page);
> }
Ah, okay. Confusing stuff. Would have been nice to document/mention that
in the patch description.
So if it compiles, all good
Acked-by: David Hildenbrand (Arm) <david@kernel.org>
--
Cheers,
David
On 2026-02-06 13:59, David Hildenbrand (Arm) wrote:
> On 2/6/26 12:58, Qi Zheng wrote:
>>
>>
>> On 2/6/26 7:45 PM, David Hildenbrand (Arm) wrote:
>>> On 2/6/26 12:13, Qi Zheng wrote:
>>>>
>>>>
>>>>
>>>> Ah, It's just simply aligned with the MMU_GATHER_RCU_TABLE_FREE above.
>>>
>>> But does that work as expected for !SMP?
>>
>> In the case of !SMP, tlb_remove_table() will not be called:
>>
>> static inline void pgtable_free_tlb(struct mmu_gather *tlb, void *table, bool is_page)
>> {
>> pgtable_free(table, is_page);
>> }
>
> Ah, okay. Confusing stuff. Would have been nice to document/mention that in the patch description.
>
> So if it compiles, all good
>
> Acked-by: David Hildenbrand (Arm) <david@kernel.org>
>
It looks a bit weird, but it is actually more logically correct than
before the patch. Before this in the !SMP sparc64 case
__HAVE_ARCH_TLB_REMOVE_TABLE was defined even with no actual
__tlb_remove_table() present. But it did not matter in practice.
But I agree that a mention would not hurt.
Tested both with SMP and !SMP
Tested-by: Andreas Larsson <andreas@gaisler.com> #sparc
Acked-by: Andreas Larsson <andreas@gaisler.com> #sparc
Cheers,
Andreas
© 2016 - 2026 Red Hat, Inc.