Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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

+6 -4
+6 -4
arch/x86/entry/calling.h
··· 374 374 * Fetch the per-CPU GSBASE value for this processor and put it in @reg. 375 375 * We normally use %gs for accessing per-CPU data, but we are setting up 376 376 * %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. 377 382 */ 378 383 .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 383 385 andq $VDSO_CPUNODE_MASK, \reg 384 386 movq __per_cpu_offset(, \reg, 8), \reg 385 387 .endm