Skip to content

Commit 2361133

Browse files
rkrcmarbonzini
authored andcommitted
KVM: VMX: refactor setup of global page-sized bitmaps
We've had 10 page-sized bitmaps that were being allocated and freed one by one when we could just use a cycle. Signed-off-by: Radim Krčmář <[email protected]>
1 parent 2e69f86 commit 2361133

File tree

1 file changed

+38
-82
lines changed

1 file changed

+38
-82
lines changed

arch/x86/kvm/vmx.c

Lines changed: 38 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -920,16 +920,32 @@ static DEFINE_PER_CPU(struct desc_ptr, host_gdt);
920920
static DEFINE_PER_CPU(struct list_head, blocked_vcpu_on_cpu);
921921
static DEFINE_PER_CPU(spinlock_t, blocked_vcpu_on_cpu_lock);
922922

923-
static unsigned long *vmx_io_bitmap_a;
924-
static unsigned long *vmx_io_bitmap_b;
925-
static unsigned long *vmx_msr_bitmap_legacy;
926-
static unsigned long *vmx_msr_bitmap_longmode;
927-
static unsigned long *vmx_msr_bitmap_legacy_x2apic_apicv;
928-
static unsigned long *vmx_msr_bitmap_longmode_x2apic_apicv;
929-
static unsigned long *vmx_msr_bitmap_legacy_x2apic;
930-
static unsigned long *vmx_msr_bitmap_longmode_x2apic;
931-
static unsigned long *vmx_vmread_bitmap;
932-
static unsigned long *vmx_vmwrite_bitmap;
923+
enum {
924+
VMX_IO_BITMAP_A,
925+
VMX_IO_BITMAP_B,
926+
VMX_MSR_BITMAP_LEGACY,
927+
VMX_MSR_BITMAP_LONGMODE,
928+
VMX_MSR_BITMAP_LEGACY_X2APIC_APICV,
929+
VMX_MSR_BITMAP_LONGMODE_X2APIC_APICV,
930+
VMX_MSR_BITMAP_LEGACY_X2APIC,
931+
VMX_MSR_BITMAP_LONGMODE_X2APIC,
932+
VMX_VMREAD_BITMAP,
933+
VMX_VMWRITE_BITMAP,
934+
VMX_BITMAP_NR
935+
};
936+
937+
static unsigned long *vmx_bitmap[VMX_BITMAP_NR];
938+
939+
#define vmx_io_bitmap_a (vmx_bitmap[VMX_IO_BITMAP_A])
940+
#define vmx_io_bitmap_b (vmx_bitmap[VMX_IO_BITMAP_B])
941+
#define vmx_msr_bitmap_legacy (vmx_bitmap[VMX_MSR_BITMAP_LEGACY])
942+
#define vmx_msr_bitmap_longmode (vmx_bitmap[VMX_MSR_BITMAP_LONGMODE])
943+
#define vmx_msr_bitmap_legacy_x2apic_apicv (vmx_bitmap[VMX_MSR_BITMAP_LEGACY_X2APIC_APICV])
944+
#define vmx_msr_bitmap_longmode_x2apic_apicv (vmx_bitmap[VMX_MSR_BITMAP_LONGMODE_X2APIC_APICV])
945+
#define vmx_msr_bitmap_legacy_x2apic (vmx_bitmap[VMX_MSR_BITMAP_LEGACY_X2APIC])
946+
#define vmx_msr_bitmap_longmode_x2apic (vmx_bitmap[VMX_MSR_BITMAP_LONGMODE_X2APIC])
947+
#define vmx_vmread_bitmap (vmx_bitmap[VMX_VMREAD_BITMAP])
948+
#define vmx_vmwrite_bitmap (vmx_bitmap[VMX_VMWRITE_BITMAP])
933949

934950
static bool cpu_has_load_ia32_efer;
935951
static bool cpu_has_load_perf_global_ctrl;
@@ -6287,50 +6303,13 @@ static __init int hardware_setup(void)
62876303
for (i = 0; i < ARRAY_SIZE(vmx_msr_index); ++i)
62886304
kvm_define_shared_msr(i, vmx_msr_index[i]);
62896305

6290-
vmx_io_bitmap_a = (unsigned long *)__get_free_page(GFP_KERNEL);
6291-
if (!vmx_io_bitmap_a)
6292-
return r;
6306+
for (i = 0; i < VMX_BITMAP_NR; i++) {
6307+
vmx_bitmap[i] = (unsigned long *)__get_free_page(GFP_KERNEL);
6308+
if (!vmx_bitmap[i])
6309+
goto out;
6310+
}
62936311

62946312
vmx_io_bitmap_b = (unsigned long *)__get_free_page(GFP_KERNEL);
6295-
if (!vmx_io_bitmap_b)
6296-
goto out;
6297-
6298-
vmx_msr_bitmap_legacy = (unsigned long *)__get_free_page(GFP_KERNEL);
6299-
if (!vmx_msr_bitmap_legacy)
6300-
goto out1;
6301-
6302-
vmx_msr_bitmap_legacy_x2apic_apicv =
6303-
(unsigned long *)__get_free_page(GFP_KERNEL);
6304-
if (!vmx_msr_bitmap_legacy_x2apic_apicv)
6305-
goto out2;
6306-
6307-
vmx_msr_bitmap_legacy_x2apic =
6308-
(unsigned long *)__get_free_page(GFP_KERNEL);
6309-
if (!vmx_msr_bitmap_legacy_x2apic)
6310-
goto out3;
6311-
6312-
vmx_msr_bitmap_longmode = (unsigned long *)__get_free_page(GFP_KERNEL);
6313-
if (!vmx_msr_bitmap_longmode)
6314-
goto out4;
6315-
6316-
vmx_msr_bitmap_longmode_x2apic_apicv =
6317-
(unsigned long *)__get_free_page(GFP_KERNEL);
6318-
if (!vmx_msr_bitmap_longmode_x2apic_apicv)
6319-
goto out5;
6320-
6321-
vmx_msr_bitmap_longmode_x2apic =
6322-
(unsigned long *)__get_free_page(GFP_KERNEL);
6323-
if (!vmx_msr_bitmap_longmode_x2apic)
6324-
goto out6;
6325-
6326-
vmx_vmread_bitmap = (unsigned long *)__get_free_page(GFP_KERNEL);
6327-
if (!vmx_vmread_bitmap)
6328-
goto out7;
6329-
6330-
vmx_vmwrite_bitmap = (unsigned long *)__get_free_page(GFP_KERNEL);
6331-
if (!vmx_vmwrite_bitmap)
6332-
goto out8;
6333-
63346313
memset(vmx_vmread_bitmap, 0xff, PAGE_SIZE);
63356314
memset(vmx_vmwrite_bitmap, 0xff, PAGE_SIZE);
63366315

@@ -6348,7 +6327,7 @@ static __init int hardware_setup(void)
63486327

63496328
if (setup_vmcs_config(&vmcs_config) < 0) {
63506329
r = -EIO;
6351-
goto out9;
6330+
goto out;
63526331
}
63536332

63546333
if (boot_cpu_has(X86_FEATURE_NX))
@@ -6485,42 +6464,19 @@ static __init int hardware_setup(void)
64856464

64866465
return alloc_kvm_area();
64876466

6488-
out9:
6489-
free_page((unsigned long)vmx_vmwrite_bitmap);
6490-
out8:
6491-
free_page((unsigned long)vmx_vmread_bitmap);
6492-
out7:
6493-
free_page((unsigned long)vmx_msr_bitmap_longmode_x2apic);
6494-
out6:
6495-
free_page((unsigned long)vmx_msr_bitmap_longmode_x2apic_apicv);
6496-
out5:
6497-
free_page((unsigned long)vmx_msr_bitmap_longmode);
6498-
out4:
6499-
free_page((unsigned long)vmx_msr_bitmap_legacy_x2apic);
6500-
out3:
6501-
free_page((unsigned long)vmx_msr_bitmap_legacy_x2apic_apicv);
6502-
out2:
6503-
free_page((unsigned long)vmx_msr_bitmap_legacy);
6504-
out1:
6505-
free_page((unsigned long)vmx_io_bitmap_b);
65066467
out:
6507-
free_page((unsigned long)vmx_io_bitmap_a);
6468+
for (i = 0; i < VMX_BITMAP_NR; i++)
6469+
free_page((unsigned long)vmx_bitmap[i]);
65086470

65096471
return r;
65106472
}
65116473

65126474
static __exit void hardware_unsetup(void)
65136475
{
6514-
free_page((unsigned long)vmx_msr_bitmap_legacy_x2apic_apicv);
6515-
free_page((unsigned long)vmx_msr_bitmap_legacy_x2apic);
6516-
free_page((unsigned long)vmx_msr_bitmap_longmode_x2apic_apicv);
6517-
free_page((unsigned long)vmx_msr_bitmap_longmode_x2apic);
6518-
free_page((unsigned long)vmx_msr_bitmap_legacy);
6519-
free_page((unsigned long)vmx_msr_bitmap_longmode);
6520-
free_page((unsigned long)vmx_io_bitmap_b);
6521-
free_page((unsigned long)vmx_io_bitmap_a);
6522-
free_page((unsigned long)vmx_vmwrite_bitmap);
6523-
free_page((unsigned long)vmx_vmread_bitmap);
6476+
int i;
6477+
6478+
for (i = 0; i < VMX_BITMAP_NR; i++)
6479+
free_page((unsigned long)vmx_bitmap[i]);
65246480

65256481
free_kvm_area();
65266482
}

0 commit comments

Comments
 (0)