On Thu, 6 Feb 2025 at 05:45, Rik van Riel <riel@xxxxxxxxxxx> wrote: > diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c > index 36939b104561..227e972b6fbc 100644 > --- a/arch/x86/mm/tlb.c > +++ b/arch/x86/mm/tlb.c > @@ -1086,6 +1086,30 @@ void flush_tlb_all(void) > on_each_cpu(do_flush_tlb_all, NULL, 1); > } > > +static bool broadcast_kernel_range_flush(struct flush_tlb_info *info) > +{ > + unsigned long addr; > + unsigned long nr; > + > + if (!IS_ENABLED(CONFIG_X86_BROADCAST_TLB_FLUSH)) > + return false; > + > + if (!cpu_feature_enabled(X86_FEATURE_INVLPGB)) > + return false; I think that first conditional can be shunted off into the header diff --git a/arch/x86/include/asm/disabled-features.h b/arch/x86/include/asm/disabled-features.h index c492bdc97b05..61376b4e4fa7 100644 --- a/arch/x86/include/asm/disabled-features.h +++ b/arch/x86/include/asm/disabled-features.h @@ -129,6 +129,12 @@ #define DISABLE_SEV_SNP (1 << (X86_FEATURE_SEV_SNP & 31)) #endif +#ifdef CONFIG_X86_BROADCAST_TLB_FLUSH +#define DISABLE_INVLPGB 0 +#else +#define DISABLE_INVLPGB (1 << (X86_FEATURE_INVLPGB & 31)) +#endif + /* * Make sure to add features to the correct mask */ @@ -146,7 +152,7 @@ #define DISABLED_MASK11 (DISABLE_RETPOLINE|DISABLE_RETHUNK|DISABLE_UNRET| \ DISABLE_CALL_DEPTH_TRACKING|DISABLE_USER_SHSTK) #define DISABLED_MASK12 (DISABLE_FRED|DISABLE_LAM) -#define DISABLED_MASK13 0 +#define DISABLED_MASK13 (DISABLE_INVLPGB) #define DISABLED_MASK14 0 #define DISABLED_MASK15 0 #define DISABLED_MASK16 (DISABLE_PKU|DISABLE_OSPKE|DISABLE_LA57|DISABLE_UMIP| \ diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c index 227e972b6fbc..b8a8665359a2 100644 --- a/arch/x86/mm/tlb.c +++ b/arch/x86/mm/tlb.c @@ -1091,9 +1091,6 @@ static bool broadcast_kernel_range_flush(struct flush_tlb_info *info) unsigned long addr; unsigned long nr; - if (!IS_ENABLED(CONFIG_X86_BROADCAST_TLB_FLUSH)) - return false; - if (!cpu_feature_enabled(X86_FEATURE_INVLPGB)) return false; With !CPU_SUP_AMD and the above, broadcast_kernel_range_flush disappears from tlb.o. (Caveat - I didn't actually read the disasm I just made it noinline and checked the call disappeared). It's actually more lines of code but now they're off in a boilerplate header and it's consistent with the other flags that do this.