summaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/vmx.c
diff options
context:
space:
mode:
authorLiran Alon2018-06-23 01:35:12 +0200
committerPaolo Bonzini2018-08-06 17:58:47 +0200
commit491a6038458fc07ec307447dd5e6722e34d67c04 (patch)
tree19cef5f0f6aa16b922a4ff7f4fa31d0aa79f44c4 /arch/x86/kvm/vmx.c
parentKVM: nVMX: Expose VMCS shadowing to L1 guest (diff)
downloadkernel-qcow2-linux-491a6038458fc07ec307447dd5e6722e34d67c04.tar.gz
kernel-qcow2-linux-491a6038458fc07ec307447dd5e6722e34d67c04.tar.xz
kernel-qcow2-linux-491a6038458fc07ec307447dd5e6722e34d67c04.zip
KVM: VMX: Mark vmcs header as shadow in case alloc_vmcs_cpu() allocate shadow vmcs
No functionality change. Signed-off-by: Liran Alon <liran.alon@oracle.com> Signed-off-by: Jim Mattson <jmattson@google.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'arch/x86/kvm/vmx.c')
-rw-r--r--arch/x86/kvm/vmx.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index 7cf64cbc3afd..098926a07cf7 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -4418,7 +4418,7 @@ static __init int setup_vmcs_config(struct vmcs_config *vmcs_conf)
return 0;
}
-static struct vmcs *alloc_vmcs_cpu(int cpu)
+static struct vmcs *alloc_vmcs_cpu(bool shadow, int cpu)
{
int node = cpu_to_node(cpu);
struct page *pages;
@@ -4436,6 +4436,8 @@ static struct vmcs *alloc_vmcs_cpu(int cpu)
else
vmcs->hdr.revision_id = vmcs_config.revision_id;
+ if (shadow)
+ vmcs->hdr.shadow_vmcs = 1;
return vmcs;
}
@@ -4459,14 +4461,14 @@ static void free_loaded_vmcs(struct loaded_vmcs *loaded_vmcs)
WARN_ON(loaded_vmcs->shadow_vmcs != NULL);
}
-static struct vmcs *alloc_vmcs(void)
+static struct vmcs *alloc_vmcs(bool shadow)
{
- return alloc_vmcs_cpu(raw_smp_processor_id());
+ return alloc_vmcs_cpu(shadow, raw_smp_processor_id());
}
static int alloc_loaded_vmcs(struct loaded_vmcs *loaded_vmcs)
{
- loaded_vmcs->vmcs = alloc_vmcs();
+ loaded_vmcs->vmcs = alloc_vmcs(false);
if (!loaded_vmcs->vmcs)
return -ENOMEM;
@@ -4597,7 +4599,7 @@ static __init int alloc_kvm_area(void)
for_each_possible_cpu(cpu) {
struct vmcs *vmcs;
- vmcs = alloc_vmcs_cpu(cpu);
+ vmcs = alloc_vmcs_cpu(false, cpu);
if (!vmcs) {
free_kvm_area();
return -ENOMEM;
@@ -7922,11 +7924,9 @@ static int enter_vmx_operation(struct kvm_vcpu *vcpu)
goto out_cached_shadow_vmcs12;
if (enable_shadow_vmcs) {
- shadow_vmcs = alloc_vmcs();
+ shadow_vmcs = alloc_vmcs(true);
if (!shadow_vmcs)
goto out_shadow_vmcs;
- /* mark vmcs as shadow */
- shadow_vmcs->hdr.shadow_vmcs = 1;
/* init shadow vmcs */
vmcs_clear(shadow_vmcs);
vmx->vmcs01.shadow_vmcs = shadow_vmcs;