>-----Original Message-----
>From: Neo Jia [mailto:[EMAIL PROTECTED]
>Sent: 2007年4月29日 14:36
>To: He, Qing
>Cc: kvm-devel
>Subject: Re: [kvm-devel] [PATCH] vmx: enable io bitmaps to avoid IO port 0x80
>VMEXITs
>
>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?
There's no special reason, just because these two pages are logically
connected. I know there is a concern that allocating two separate pages is
easier, but does that really matter?
>
>> + 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.
Yeah, setting it to NULL is better practice, I just missed that. But it is not
necessary because after the pages are freed, the kernel module is also removed.
In fact, I also think this bitmap should be better if it's in some per-VM vmx
specific context, but such a context is not there in current KVM. And for this
patch, it's just safe for all VMs to share the io bitmap.
Thanks,
Qing
>
>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