On 4/29/07, He, Qing <[EMAIL PROTECTED]> wrote: > 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);
Why allocate two continuous pages instead of two separate pages for IO_BITMAP_A and IO_BITMAP_B? > + 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); Is there necessary to set vmx_io_bimap to NULL after free_page? And, I assume that this one should go to vmx member later. Thanks, Neo > kvm_exit_arch(); > } > > > ------------------------------------------------------------------------- > 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 > > > -- I would remember that if researchers were not ambitious probably today we haven't the technology we are using! ------------------------------------------------------------------------- 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