]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
mm: introduce CONFIG_ARCH_HAS_LAZY_MMU_MODE
authorKevin Brodsky <kevin.brodsky@arm.com>
Mon, 15 Dec 2025 15:03:15 +0000 (15:03 +0000)
committerAndrew Morton <akpm@linux-foundation.org>
Wed, 21 Jan 2026 03:24:33 +0000 (19:24 -0800)
Architectures currently opt in for implementing lazy_mmu helpers by
defining __HAVE_ARCH_ENTER_LAZY_MMU_MODE.

In preparation for introducing a generic lazy_mmu layer that will require
storage in task_struct, let's switch to a cleaner approach: instead of
defining a macro, select a CONFIG option.

This patch introduces CONFIG_ARCH_HAS_LAZY_MMU_MODE and has each arch
select it when it implements lazy_mmu helpers.
__HAVE_ARCH_ENTER_LAZY_MMU_MODE is removed and <linux/pgtable.h> relies on
the new CONFIG instead.

On x86, lazy_mmu helpers are only implemented if PARAVIRT_XXL is selected.
This creates some complications in arch/x86/boot/, because a few files
manually undefine PARAVIRT* options.  As a result <asm/paravirt.h> does
not define the lazy_mmu helpers, but this breaks the build as
<linux/pgtable.h> only defines them if !CONFIG_ARCH_HAS_LAZY_MMU_MODE.
There does not seem to be a clean way out of this - let's just undefine
that new CONFIG too.

Link: https://lkml.kernel.org/r/20251215150323.2218608-7-kevin.brodsky@arm.com
Signed-off-by: Kevin Brodsky <kevin.brodsky@arm.com>
Acked-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
Reviewed-by: Ryan Roberts <ryan.roberts@arm.com>
Reviewed-by: Yeoreum Yun <yeoreum.yun@arm.com>
Acked-by: Andreas Larsson <andreas@gaisler.com> [sparc]
Cc: Alexander Gordeev <agordeev@linux.ibm.com>
Cc: Anshuman Khandual <anshuman.khandual@arm.com>
Cc: Borislav Betkov <bp@alien8.de>
Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Christophe Leroy <christophe.leroy@csgroup.eu>
Cc: David Hildenbrand (Red Hat) <david@kernel.org>
Cc: David S. Miller <davem@davemloft.net>
Cc: David Woodhouse <dwmw2@infradead.org>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jann Horn <jannh@google.com>
Cc: Juegren Gross <jgross@suse.com>
Cc: Liam Howlett <liam.howlett@oracle.com>
Cc: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Mike Rapoport <rppt@kernel.org>
Cc: Nicholas Piggin <npiggin@gmail.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Thomas Gleinxer <tglx@linutronix.de>
Cc: Venkat Rao Bagalkote <venkat88@linux.ibm.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Cc: Will Deacon <will@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
12 files changed:
arch/arm64/Kconfig
arch/arm64/include/asm/pgtable.h
arch/powerpc/include/asm/book3s/64/tlbflush-hash.h
arch/powerpc/platforms/Kconfig.cputype
arch/sparc/Kconfig
arch/sparc/include/asm/tlbflush_64.h
arch/x86/Kconfig
arch/x86/boot/compressed/misc.h
arch/x86/boot/startup/sme.c
arch/x86/include/asm/paravirt.h
include/linux/pgtable.h
mm/Kconfig

index 93173f0a09c7deb07b46ab4f16a1a0e4320dfbf1..3fb4603c0e16bfaf0f20c7dfdfc87191d704d812 100644 (file)
@@ -35,6 +35,7 @@ config ARM64
        select ARCH_HAS_KCOV
        select ARCH_HAS_KERNEL_FPU_SUPPORT if KERNEL_MODE_NEON
        select ARCH_HAS_KEEPINITRD
+       select ARCH_HAS_LAZY_MMU_MODE
        select ARCH_HAS_MEMBARRIER_SYNC_CORE
        select ARCH_HAS_MEM_ENCRYPT
        select ARCH_SUPPORTS_MSEAL_SYSTEM_MAPPINGS
index 64d5f1d9cce96c769cbb768173f1cdd3bedeb642..f7d66c2613476ab1d4dd91fe3a0d6b96b6b8bbc4 100644 (file)
@@ -80,7 +80,6 @@ static inline void queue_pte_barriers(void)
        }
 }
 
-#define  __HAVE_ARCH_ENTER_LAZY_MMU_MODE
 static inline void arch_enter_lazy_mmu_mode(void)
 {
        /*
index 2d45f57df1692ae49f14e759d989d529ce6f8dae..565c1b7c3eae14009e6269f203e8d77fdfe4f10b 100644 (file)
@@ -24,8 +24,6 @@ DECLARE_PER_CPU(struct ppc64_tlb_batch, ppc64_tlb_batch);
 
 extern void __flush_tlb_pending(struct ppc64_tlb_batch *batch);
 
-#define __HAVE_ARCH_ENTER_LAZY_MMU_MODE
-
 static inline void arch_enter_lazy_mmu_mode(void)
 {
        struct ppc64_tlb_batch *batch;
index 4c321a8ea89654f4718a55b701ac88eae8f5330c..f399917c17bdc22619421bdebbf4c3b4bbf2bdfc 100644 (file)
@@ -93,6 +93,7 @@ config PPC_BOOK3S_64
        select IRQ_WORK
        select PPC_64S_HASH_MMU if !PPC_RADIX_MMU
        select KASAN_VMALLOC if KASAN
+       select ARCH_HAS_LAZY_MMU_MODE
 
 config PPC_BOOK3E_64
        bool "Embedded processors"
index a630d373e6453c745ab8bf58fc5622cf0edaf4c9..2bad14744ca4e31f9e809d20ffba984d35ed98fb 100644 (file)
@@ -112,6 +112,7 @@ config SPARC64
        select NEED_PER_CPU_PAGE_FIRST_CHUNK
        select ARCH_SUPPORTS_SCHED_SMT if SMP
        select ARCH_SUPPORTS_SCHED_MC  if SMP
+       select ARCH_HAS_LAZY_MMU_MODE
 
 config ARCH_PROC_KCORE_TEXT
        def_bool y
index 925bb5d7a4e1e3e6fa8fe41aec43db36ea78c7f7..4e1036728e2fbe3c535bbc225f6d37e045b86ee8 100644 (file)
@@ -39,8 +39,6 @@ static inline void flush_tlb_range(struct vm_area_struct *vma,
 
 void flush_tlb_kernel_range(unsigned long start, unsigned long end);
 
-#define __HAVE_ARCH_ENTER_LAZY_MMU_MODE
-
 void flush_tlb_pending(void);
 void arch_enter_lazy_mmu_mode(void);
 void arch_flush_lazy_mmu_mode(void);
index 80527299f859aaab7e357f59a410ac436daafd1f..2427a66cb0fe5e10e7274f87c2457d1da50e82f6 100644 (file)
@@ -808,6 +808,7 @@ config PARAVIRT
 config PARAVIRT_XXL
        bool
        depends on X86_64
+       select ARCH_HAS_LAZY_MMU_MODE
 
 config PARAVIRT_DEBUG
        bool "paravirt-ops debugging"
index fd855e32c9b9e9a09b566a96ae7d10a5a2556e35..4f86c5903e033f36e01c188a2cb925d33ca494dc 100644 (file)
@@ -11,6 +11,7 @@
 #undef CONFIG_PARAVIRT
 #undef CONFIG_PARAVIRT_XXL
 #undef CONFIG_PARAVIRT_SPINLOCKS
+#undef CONFIG_ARCH_HAS_LAZY_MMU_MODE
 #undef CONFIG_KASAN
 #undef CONFIG_KASAN_GENERIC
 
index e7ea65f3f1d6a53f7f450e847f31953e41ae272c..b76a7c95dfe1bbbcd5b40b8b530e067cdef29eef 100644 (file)
@@ -24,6 +24,7 @@
 #undef CONFIG_PARAVIRT
 #undef CONFIG_PARAVIRT_XXL
 #undef CONFIG_PARAVIRT_SPINLOCKS
+#undef CONFIG_ARCH_HAS_LAZY_MMU_MODE
 
 /*
  * This code runs before CPU feature bits are set. By default, the
index b5e59a7ba0d0e206e01a2f63b2dfa3dbbe6ef81d..13f9cd31c8f8b3f4c920559250c4e649d7b5f23f 100644 (file)
@@ -526,7 +526,6 @@ static inline void arch_end_context_switch(struct task_struct *next)
        PVOP_VCALL1(cpu.end_context_switch, next);
 }
 
-#define  __HAVE_ARCH_ENTER_LAZY_MMU_MODE
 static inline void arch_enter_lazy_mmu_mode(void)
 {
        PVOP_VCALL0(mmu.lazy_mode.enter);
index 1abc4a1c3d72f3f581a56bb8dc86c86338d4d7e8..d46d86959bd677ac7c20373a0a2cd0862f7d56a5 100644 (file)
@@ -235,7 +235,7 @@ static inline int pmd_dirty(pmd_t pmd)
  *
  * Nesting is not permitted and the mode cannot be used in interrupt context.
  */
-#ifndef __HAVE_ARCH_ENTER_LAZY_MMU_MODE
+#ifndef CONFIG_ARCH_HAS_LAZY_MMU_MODE
 static inline void arch_enter_lazy_mmu_mode(void) {}
 static inline void arch_leave_lazy_mmu_mode(void) {}
 static inline void arch_flush_lazy_mmu_mode(void) {}
index a992f2203eb916b0a2a2774dcad7186cc2042c07..7c2520e6a6b3006935da36e2243cd51e64d2ab4c 100644 (file)
@@ -1468,6 +1468,13 @@ config PT_RECLAIM
 config FIND_NORMAL_PAGE
        def_bool n
 
+config ARCH_HAS_LAZY_MMU_MODE
+       bool
+       help
+         The architecture uses the lazy MMU mode. This allows changes to
+         MMU-related architectural state to be deferred until the mode is
+         exited. See <linux/pgtable.h> for details.
+
 source "mm/damon/Kconfig"
 
 endmenu