|
Borislav Petkov |
193174 |
From: Sean Christopherson <seanjc@google.com>
|
|
Borislav Petkov |
193174 |
Date: Tue, 4 May 2021 15:56:31 -0700
|
|
Borislav Petkov |
193174 |
Subject: x86/cpu: Initialize MSR_TSC_AUX if RDTSCP *or* RDPID is supported
|
|
Borislav Petkov |
193174 |
Git-commit: b6b4fbd90b155a0025223df2c137af8a701d53b3
|
|
Borislav Petkov |
193174 |
Patch-mainline: v5.13-rc1
|
|
Borislav Petkov |
193174 |
References: bsc#1152489
|
|
Borislav Petkov |
193174 |
|
|
Borislav Petkov |
193174 |
Initialize MSR_TSC_AUX with CPU node information if RDTSCP or RDPID is
|
|
Borislav Petkov |
193174 |
supported. This fixes a bug where vdso_read_cpunode() will read garbage
|
|
Borislav Petkov |
193174 |
via RDPID if RDPID is supported but RDTSCP is not. While no known CPU
|
|
Borislav Petkov |
193174 |
supports RDPID but not RDTSCP, both Intel's SDM and AMD's APM allow for
|
|
Borislav Petkov |
193174 |
RDPID to exist without RDTSCP, e.g. it's technically a legal CPU model
|
|
Borislav Petkov |
193174 |
for a virtual machine.
|
|
Borislav Petkov |
193174 |
|
|
Borislav Petkov |
193174 |
Note, technically MSR_TSC_AUX could be initialized if and only if RDPID
|
|
Borislav Petkov |
193174 |
is supported since RDTSCP is currently not used to retrieve the CPU node.
|
|
Borislav Petkov |
193174 |
But, the cost of the superfluous WRMSR is negigible, whereas leaving
|
|
Borislav Petkov |
193174 |
MSR_TSC_AUX uninitialized is just asking for future breakage if someone
|
|
Borislav Petkov |
193174 |
decides to utilize RDTSCP.
|
|
Borislav Petkov |
193174 |
|
|
Borislav Petkov |
193174 |
Fixes: a582c540ac1b ("x86/vdso: Use RDPID in preference to LSL when available")
|
|
Borislav Petkov |
193174 |
Signed-off-by: Sean Christopherson <seanjc@google.com>
|
|
Borislav Petkov |
193174 |
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|
Borislav Petkov |
193174 |
Cc: stable@vger.kernel.org
|
|
Borislav Petkov |
193174 |
Link: https://lore.kernel.org/r/20210504225632.1532621-2-seanjc@google.com
|
|
Borislav Petkov |
193174 |
|
|
Borislav Petkov |
193174 |
Acked-by: Borislav Petkov <bp@suse.de>
|
|
Borislav Petkov |
193174 |
---
|
|
Borislav Petkov |
193174 |
arch/x86/kernel/cpu/common.c | 2 +-
|
|
Borislav Petkov |
193174 |
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
Borislav Petkov |
193174 |
|
|
Borislav Petkov |
193174 |
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
|
|
Borislav Petkov |
193174 |
index 6bdb69a9a7dc..490bed07fe35 100644
|
|
Borislav Petkov |
193174 |
--- a/arch/x86/kernel/cpu/common.c
|
|
Borislav Petkov |
193174 |
+++ b/arch/x86/kernel/cpu/common.c
|
|
Borislav Petkov |
193174 |
@@ -1851,7 +1851,7 @@ static inline void setup_getcpu(int cpu)
|
|
Borislav Petkov |
193174 |
unsigned long cpudata = vdso_encode_cpunode(cpu, early_cpu_to_node(cpu));
|
|
Borislav Petkov |
193174 |
struct desc_struct d = { };
|
|
Borislav Petkov |
193174 |
|
|
Borislav Petkov |
193174 |
- if (boot_cpu_has(X86_FEATURE_RDTSCP))
|
|
Borislav Petkov |
193174 |
+ if (boot_cpu_has(X86_FEATURE_RDTSCP) || boot_cpu_has(X86_FEATURE_RDPID))
|
|
Borislav Petkov |
193174 |
write_rdtscp_aux(cpudata);
|
|
Borislav Petkov |
193174 |
|
|
Borislav Petkov |
193174 |
/* Store CPU and node number in limit. */
|
|
Borislav Petkov |
193174 |
|