Skip to content

Commit 550c212

Browse files
committed
Merge tag 'x86-urgent-2020-08-23' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 fix from Thomas Gleixner: "A single fix for x86 which removes the RDPID usage from the paranoid entry path and unconditionally uses LSL to retrieve the CPU number. RDPID depends on MSR_TSX_AUX. KVM has an optmization to avoid expensive MRS read/writes on VMENTER/EXIT. It caches the MSR values and restores them either when leaving the run loop, on preemption or when going out to user space. MSR_TSX_AUX is part of that lazy MSR set, so after writing the guest value and before the lazy restore any exception using the paranoid entry will read the guest value and use it as CPU number to retrieve the GSBASE value for the current CPU when FSGSBASE is enabled. As RDPID is only used in that particular entry path, there is no reason to burden VMENTER/EXIT with two extra MSR writes. Remove the RDPID optimization, which is not even backed by numbers from the paranoid entry path instead" * tag 'x86-urgent-2020-08-23' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: x86/entry/64: Do not use RDPID in paranoid entry to accomodate KVM
2 parents cea05c1 + 6a3ea3e commit 550c212

File tree

1 file changed

+6
-4
lines changed

1 file changed

+6
-4
lines changed

arch/x86/entry/calling.h

+6-4
Original file line numberDiff line numberDiff line change
@@ -374,12 +374,14 @@ For 32-bit we have the following conventions - kernel is built with
374374
* Fetch the per-CPU GSBASE value for this processor and put it in @reg.
375375
* We normally use %gs for accessing per-CPU data, but we are setting up
376376
* %gs here and obviously can not use %gs itself to access per-CPU data.
377+
*
378+
* Do not use RDPID, because KVM loads guest's TSC_AUX on vm-entry and
379+
* may not restore the host's value until the CPU returns to userspace.
380+
* Thus the kernel would consume a guest's TSC_AUX if an NMI arrives
381+
* while running KVM's run loop.
377382
*/
378383
.macro GET_PERCPU_BASE reg:req
379-
ALTERNATIVE \
380-
"LOAD_CPU_AND_NODE_SEG_LIMIT \reg", \
381-
"RDPID \reg", \
382-
X86_FEATURE_RDPID
384+
LOAD_CPU_AND_NODE_SEG_LIMIT \reg
383385
andq $VDSO_CPUNODE_MASK, \reg
384386
movq __per_cpu_offset(, \reg, 8), \reg
385387
.endm

0 commit comments

Comments
 (0)