Skip to content

Commit

Permalink
KVM: nVMX: Allocate and configure VM{READ,WRITE} bitmaps iff enable_s…
Browse files Browse the repository at this point in the history
…hadow_vmcs

...and make enable_shadow_vmcs depend on nested.  Aside from the obvious
memory savings, this will allow moving the relevant code out of vmx.c in
the future, e.g. to a nested specific file.

Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
  • Loading branch information
Sean Christopherson authored and Paolo Bonzini committed Dec 14, 2018
1 parent 1b3ab5a commit dfae3c0
Showing 1 changed file with 23 additions and 20 deletions.
43 changes: 23 additions & 20 deletions arch/x86/kvm/vmx.c
Original file line number Diff line number Diff line change
Expand Up @@ -4862,6 +4862,9 @@ static void init_vmcs_shadow_fields(void)
{
int i, j;

memset(vmx_vmread_bitmap, 0xff, PAGE_SIZE);
memset(vmx_vmwrite_bitmap, 0xff, PAGE_SIZE);

for (i = j = 0; i < max_shadow_read_only_fields; i++) {
u16 field = shadow_read_only_fields[i];
if (vmcs_field_width(field) == VMCS_FIELD_WIDTH_U64 &&
Expand Down Expand Up @@ -7904,19 +7907,8 @@ static __init int hardware_setup(void)
for (i = 0; i < ARRAY_SIZE(vmx_msr_index); ++i)
kvm_define_shared_msr(i, vmx_msr_index[i]);

for (i = 0; i < VMX_BITMAP_NR; i++) {
vmx_bitmap[i] = (unsigned long *)__get_free_page(GFP_KERNEL);
if (!vmx_bitmap[i])
goto out;
}

memset(vmx_vmread_bitmap, 0xff, PAGE_SIZE);
memset(vmx_vmwrite_bitmap, 0xff, PAGE_SIZE);

if (setup_vmcs_config(&vmcs_config) < 0) {
r = -EIO;
goto out;
}
if (setup_vmcs_config(&vmcs_config) < 0)
return -EIO;

if (boot_cpu_has(X86_FEATURE_NX))
kvm_enable_efer_bits(EFER_NX);
Expand Down Expand Up @@ -8027,10 +8019,18 @@ static __init int hardware_setup(void)
kvm_x86_ops->cancel_hv_timer = NULL;
}

if (!cpu_has_vmx_shadow_vmcs())
if (!cpu_has_vmx_shadow_vmcs() || !nested)
enable_shadow_vmcs = 0;
if (enable_shadow_vmcs)
if (enable_shadow_vmcs) {
for (i = 0; i < VMX_BITMAP_NR; i++) {
vmx_bitmap[i] = (unsigned long *)
__get_free_page(GFP_KERNEL);
if (!vmx_bitmap[i])
goto out;
}

init_vmcs_shadow_fields();
}

kvm_set_posted_intr_wakeup_handler(wakeup_handler);
nested_vmx_setup_ctls_msrs(&vmcs_config.nested, enable_apicv);
Expand All @@ -8043,18 +8043,21 @@ static __init int hardware_setup(void)
return 0;

out:
for (i = 0; i < VMX_BITMAP_NR; i++)
free_page((unsigned long)vmx_bitmap[i]);

if (enable_shadow_vmcs) {
for (i = 0; i < VMX_BITMAP_NR; i++)
free_page((unsigned long)vmx_bitmap[i]);
}
return r;
}

static __exit void hardware_unsetup(void)
{
int i;

for (i = 0; i < VMX_BITMAP_NR; i++)
free_page((unsigned long)vmx_bitmap[i]);
if (enable_shadow_vmcs) {
for (i = 0; i < VMX_BITMAP_NR; i++)
free_page((unsigned long)vmx_bitmap[i]);
}

free_kvm_area();
}
Expand Down

0 comments on commit dfae3c0

Please sign in to comment.