[PATCH v2] x86/mm: Hide mm_free_global_asid() definition under 'CONFIG_BROADCAST_TLB_FLUSH'

From: Hou Wenlong

Date: Wed Jan 14 2026 - 22:39:06 EST


When 'CONFIG_BROADCAST_TLB_FLUSH' is not enabled, mm_free_global_asid()
remains a globally visible symbol and generates a useless function call
to it in destroy_context(). Therefore, hide the mm_free_global_asid()
definition under 'CONFIG_BROADCAST_TLB_FLUSH' and provide a static
inline empty version when it is not enabled to remove the function call.

Reviewed-by: Rik van Riel <riel@xxxxxxxxxxx>
Signed-off-by: Hou Wenlong <houwenlong.hwl@xxxxxxxxxxxx>
---
v1->v2:
Keep the declarations of mm_init_global_asid() and mm_free_global_asid()
in 'asm/mmu_context.h' to fix the compilation failure of module
building.
---
arch/x86/include/asm/mmu_context.h | 2 --
arch/x86/include/asm/tlbflush.h | 3 +++
arch/x86/mm/tlb.c | 4 ++--
3 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/arch/x86/include/asm/mmu_context.h b/arch/x86/include/asm/mmu_context.h
index 73bf3b1b44e8..1acafb1c6a93 100644
--- a/arch/x86/include/asm/mmu_context.h
+++ b/arch/x86/include/asm/mmu_context.h
@@ -139,9 +139,7 @@ static inline void mm_reset_untag_mask(struct mm_struct *mm)
#define enter_lazy_tlb enter_lazy_tlb
extern void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk);

-#define mm_init_global_asid mm_init_global_asid
extern void mm_init_global_asid(struct mm_struct *mm);
-
extern void mm_free_global_asid(struct mm_struct *mm);

/*
diff --git a/arch/x86/include/asm/tlbflush.h b/arch/x86/include/asm/tlbflush.h
index 00daedfefc1b..5114bf50c911 100644
--- a/arch/x86/include/asm/tlbflush.h
+++ b/arch/x86/include/asm/tlbflush.h
@@ -292,9 +292,12 @@ static inline bool mm_in_asid_transition(struct mm_struct *mm)

return mm && READ_ONCE(mm->context.asid_transition);
}
+
+extern void mm_free_global_asid(struct mm_struct *mm);
#else
static inline u16 mm_global_asid(struct mm_struct *mm) { return 0; }
static inline void mm_init_global_asid(struct mm_struct *mm) { }
+static inline void mm_free_global_asid(struct mm_struct *mm) { }
static inline void mm_assign_global_asid(struct mm_struct *mm, u16 asid) { }
static inline void mm_clear_asid_transition(struct mm_struct *mm) { }
static inline bool mm_in_asid_transition(struct mm_struct *mm) { return false; }
diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c
index f5b93e01e347..621e09d049cb 100644
--- a/arch/x86/mm/tlb.c
+++ b/arch/x86/mm/tlb.c
@@ -401,6 +401,7 @@ static void use_global_asid(struct mm_struct *mm)
mm_assign_global_asid(mm, asid);
}

+#ifdef CONFIG_BROADCAST_TLB_FLUSH
void mm_free_global_asid(struct mm_struct *mm)
{
if (!cpu_feature_enabled(X86_FEATURE_INVLPGB))
@@ -412,13 +413,12 @@ void mm_free_global_asid(struct mm_struct *mm)
guard(raw_spinlock_irqsave)(&global_asid_lock);

/* The global ASID can be re-used only after flush at wrap-around. */
-#ifdef CONFIG_BROADCAST_TLB_FLUSH
__set_bit(mm->context.global_asid, global_asid_freed);

mm->context.global_asid = 0;
global_asid_available++;
-#endif
}
+#endif

/*
* Is the mm transitioning from a CPU-local ASID to a global ASID?

base-commit: 6e0e1737f35b9d3d071bba15dd36ae5ce3a5d292
--
2.31.1