Patch "KVM: nVMX: fix HOST_CR3/HOST_CR4 cache" has been added to the 4.9-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
KVM: nVMX: fix HOST_CR3/HOST_CR4 cache
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
kvm-nvmx-fix-host_cr3-host_cr4-cache.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
44889942b6eb356eab27ce25fe10701adfec7776Mon Sep 17 00:00:00 2001
From: Ladi Prosek <[email protected]>
Date: Fri, 22 Sep 2017 07:53:15 +0200
Subject: KVM: nVMX: fix HOST_CR3/HOST_CR4 cache
From: Ladi Prosek <[email protected]>
commit 44889942b6eb356eab27ce25fe10701adfec7776 upstream.
For nested virt we maintain multiple VMCS that can run on a vCPU. So it is incorrect to keep vmcs_host_cr3 and vmcs_host_cr4, whose purpose is caching the value of the rarely changing HOST_CR3 and HOST_CR4 VMCS fields, in vCPU-wide data structures.
Hyper-V nested on KVM runs into this consistently for me with PCID enabled. CR3 is updated with a new value, unlikely(cr3 != vmx->host_state.vmcs_host_cr3) fires, and the currently loaded VMCS is updated. Then we switch from L2 to L1 and the next exit reverts CR3 to its old value.
--- arch/x86/kvm/vmx.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
arch/x86/kvm/vmx.c +8 -8
@@ -191,6 +191,8 @@ struct loaded_vmcs {struct vmcs *shadow_vmcs;int cpu;int launched; +unsigned long vmcs_host_cr3;/* May not match real cr3 */ +unsigned long vmcs_host_cr4;/* May not match real cr4 */ struct list_head loaded_vmcss_on_cpu_link; };
@@ -573,8 +575,6 @@ struct vcpu_vmx {int gs_ldt_reload_needed;int fs_reload_needed;u64 msr_host_bndcfgs; -unsigned long vmcs_host_cr3;/* May not match real cr3 */ -unsigned long vmcs_host_cr4;/* May not match real cr4 */ } host_state;struct {int vm86_active;
@@ -4871,12 +4871,12 @@ static void vmx_set_constant_host_state(*/ cr3 =read_cr3 ();vmcs_writel (HOST_CR3 , cr3);/* 22.2.3 FIXME: shadow tables */ - vmx->host_state.vmcs_host_cr3 = cr3; + vmx->loaded_vmcs->vmcs_host_cr3 = cr3;/* Save the most likely value for this task's CR4 in the VMCS. */ cr4 =cr4_read_shadow ();vmcs_writel (HOST_CR4 , cr4);/* 22.2.3, 22.2.5 */ - vmx->host_state.vmcs_host_cr4 = cr4; + vmx->loaded_vmcs->vmcs_host_cr4 = cr4;vmcs_write16 (HOST_CS_SELECTOR , __KERNEL_CS);/* 22.2.4 */ #ifdef CONFIG_X86_64
@@ -8874,15 +8874,15 @@ static void __noclone vmx_vcpu_run(strucvmcs_writel (GUEST_RIP , vcpu->arch.regs[VCPU_REGS_RIP ]); cr3 =__get_current_cr3_fast (); -if (unlikely (cr3 != vmx->host_state.vmcs_host_cr3)) { +if (unlikely (cr3 != vmx->loaded_vmcs->vmcs_host_cr3)) {vmcs_writel (HOST_CR3 , cr3); - vmx->host_state.vmcs_host_cr3 = cr3; + vmx->loaded_vmcs->vmcs_host_cr3 = cr3; } cr4 =cr4_read_shadow (); -if (unlikely (cr4 != vmx->host_state.vmcs_host_cr4)) { +if (unlikely (cr4 != vmx->loaded_vmcs->vmcs_host_cr4)) {vmcs_writel (HOST_CR4 , cr4); - vmx->host_state.vmcs_host_cr4 = cr4; + vmx->loaded_vmcs->vmcs_host_cr4 = cr4; }/* When single-stepping over STI and MOV SS, we must clear the
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/kvm-nvmx-fix-host_cr3-host_cr4-cache.patch queue-4.9/virtio-balloon-use-actual-number-of-stats-for-stats-queue-buffers.patch queue-4.9/virtio_balloon-prevent-uninitialized-variable-use.patch