Skip to content

Commit

Permalink
x86/mm: Add INVLPGB feature and Kconfig entry
Browse files Browse the repository at this point in the history
In addition, the CPU advertises the maximum number of pages that can be
shot down with one INVLPGB instruction in CPUID. Save that information
for later use.

  [ bp: use cpu_has(), typos, massage. ]

Signed-off-by: Rik van Riel <riel@surriel.com>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Link: https://lore.kernel.org/r/20250226030129.530345-3-riel@surriel.com
  • Loading branch information
Rik van Riel authored and Ingo Molnar committed Mar 19, 2025
1 parent 4a02ed8 commit 767ae43
Show file tree
Hide file tree
Showing 5 changed files with 21 additions and 1 deletion.
4 changes: 4 additions & 0 deletions arch/x86/Kconfig.cpu
Original file line number Diff line number Diff line change
Expand Up @@ -334,6 +334,10 @@ menuconfig PROCESSOR_SELECT
This lets you choose what x86 vendor support code your kernel
will include.

config BROADCAST_TLB_FLUSH
def_bool y
depends on CPU_SUP_AMD && 64BIT

config CPU_SUP_INTEL
default y
bool "Support Intel processors" if PROCESSOR_SELECT
Expand Down
1 change: 1 addition & 0 deletions arch/x86/include/asm/cpufeatures.h
Original file line number Diff line number Diff line change
Expand Up @@ -338,6 +338,7 @@
#define X86_FEATURE_CLZERO (13*32+ 0) /* "clzero" CLZERO instruction */
#define X86_FEATURE_IRPERF (13*32+ 1) /* "irperf" Instructions Retired Count */
#define X86_FEATURE_XSAVEERPTR (13*32+ 2) /* "xsaveerptr" Always save/restore FP error pointers */
#define X86_FEATURE_INVLPGB (13*32+ 3) /* INVLPGB and TLBSYNC instructions supported */
#define X86_FEATURE_RDPRU (13*32+ 4) /* "rdpru" Read processor register at user level */
#define X86_FEATURE_WBNOINVD (13*32+ 9) /* "wbnoinvd" WBNOINVD instruction */
#define X86_FEATURE_AMD_IBPB (13*32+12) /* Indirect Branch Prediction Barrier */
Expand Down
8 changes: 7 additions & 1 deletion arch/x86/include/asm/disabled-features.h
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,12 @@
#define DISABLE_SEV_SNP (1 << (X86_FEATURE_SEV_SNP & 31))
#endif

#ifdef CONFIG_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
*/
Expand All @@ -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| \
Expand Down
3 changes: 3 additions & 0 deletions arch/x86/include/asm/tlbflush.h
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,9 @@ static inline void cr4_init_shadow(void)
extern unsigned long mmu_cr4_features;
extern u32 *trampoline_cr4_features;

/* How many pages can be invalidated with one INVLPGB. */
extern u16 invlpgb_count_max;

extern void initialize_tlbstate_and_flush(void);

/*
Expand Down
6 changes: 6 additions & 0 deletions arch/x86/kernel/cpu/amd.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@

#include "cpu.h"

u16 invlpgb_count_max __ro_after_init;

static inline int rdmsrl_amd_safe(unsigned msr, unsigned long long *p)
{
u32 gprs[8] = { 0 };
Expand Down Expand Up @@ -1139,6 +1141,10 @@ static void cpu_detect_tlb_amd(struct cpuinfo_x86 *c)
tlb_lli_2m = eax & mask;

tlb_lli_4m = tlb_lli_2m >> 1;

/* Max number of pages INVLPGB can invalidate in one shot */
if (cpu_has(c, X86_FEATURE_INVLPGB))
invlpgb_count_max = (cpuid_edx(0x80000008) & 0xffff) + 1;
}

static const struct cpu_dev amd_cpu_dev = {
Expand Down

0 comments on commit 767ae43

Please sign in to comment.