This patch enables IO bitmaps control on vmx and unmask the 0x80 port to avoid VMEXITs caused by accessing port 0x80. 0x80 is used as delays (see include/asm/io.h), and handling VMEXITs on its access is unnecessary but slows things down. This patch improves kernel build test at around 3%~5%. Because every VM uses the same io bitmap, it is shared between all VMs rather than a per-VM data structure.
Signed-off-by: Qing He <[EMAIL PROTECTED]> diff --git a/drivers/kvm/vmx.c b/drivers/kvm/vmx.c index 1d2b41b..a91d71f 100644 --- a/drivers/kvm/vmx.c +++ b/drivers/kvm/vmx.c @@ -33,6 +33,8 @@ MODULE_LICENSE("GPL"); static DEFINE_PER_CPU(struct vmcs *, vmxarea); static DEFINE_PER_CPU(struct vmcs *, current_vmcs); +static char *vmx_io_bitmap; + #ifdef CONFIG_X86_64 #define HOST_IS_64 1 #else @@ -1127,8 +1129,8 @@ static int vmx_vcpu_setup(struct kvm_vcpu *vcpu) vmcs_write32(GUEST_PENDING_DBG_EXCEPTIONS, 0); /* I/O */ - vmcs_write64(IO_BITMAP_A, 0); - vmcs_write64(IO_BITMAP_B, 0); + vmcs_write64(IO_BITMAP_A, (unsigned long) __pa(vmx_io_bitmap)); + vmcs_write64(IO_BITMAP_B, (unsigned long) __pa(vmx_io_bitmap + PAGE_SIZE)); guest_write_tsc(0); @@ -1148,7 +1150,7 @@ static int vmx_vcpu_setup(struct kvm_vcpu *vcpu) CPU_BASED_HLT_EXITING /* 20.6.2 */ | CPU_BASED_CR8_LOAD_EXITING /* 20.6.2 */ | CPU_BASED_CR8_STORE_EXITING /* 20.6.2 */ - | CPU_BASED_UNCOND_IO_EXITING /* 20.6.2 */ + | CPU_BASED_ACTIVATE_IO_BITMAP /* 20.6.2 */ | CPU_BASED_MOV_DR_EXITING | CPU_BASED_USE_TSC_OFFSETING /* 21.3 */ ); @@ -2190,11 +2192,39 @@ static struct kvm_arch_ops vmx_arch_ops = { static int __init vmx_init(void) { - return kvm_init_arch(&vmx_arch_ops, THIS_MODULE); + int r; + + vmx_io_bitmap = (char *) __get_free_pages(GFP_KERNEL, 1); + if (!vmx_io_bitmap) { + printk(KERN_ERR "kvm: vmx_io_bitmap allocation failed.\n"); + r = -ENOMEM; + goto out; + } + + /* + * Allow direct access to the PC debug port (it is often used for I/O + * delays, but the vmexits simply slow things down). + */ + memset(vmx_io_bitmap, ~0, 2 * PAGE_SIZE); + clear_bit(0x80, vmx_io_bitmap); + + r = kvm_init_arch(&vmx_arch_ops, THIS_MODULE); + if (r) { + goto out1; + } + + return 0; + +out1: + free_pages((unsigned long) vmx_io_bitmap, 1); +out: + return r; } static void __exit vmx_exit(void) { + if (vmx_io_bitmap) + free_pages((unsigned long) vmx_io_bitmap, 1); kvm_exit_arch(); }
kvm-vmx-io-bitmaps-0x80.patch
Description: kvm-vmx-io-bitmaps-0x80.patch
------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/
_______________________________________________ kvm-devel mailing list kvm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-devel