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 [email protected] https://lists.sourceforge.net/lists/listinfo/kvm-devel
