From: Gleb Natapov <gleb@redhat.com>
To: Abel Gordon <abelg@il.ibm.com>
Cc: kvm@vger.kernel.org, owasserm@redhat.com, nadav@harel.org.il,
jun.nakajima@intel.com, dongxiao.xu@intel.com
Subject: Re: [PATCH 04/11] KVM: nVMX: Introduce vmread and vmwrite bitmaps
Date: Mon, 8 Apr 2013 14:50:54 +0300 [thread overview]
Message-ID: <20130408115053.GK17919@redhat.com> (raw)
In-Reply-To: <20130310160525.B417B380134@moren.haifa.ibm.com>
On Sun, Mar 10, 2013 at 06:05:25PM +0200, Abel Gordon wrote:
> Prepare vmread and vmwrite bitmaps according to a pre-specified list of fields.
> These lists are intended to specifiy most frequent accessed fields so we can
> minimize the number of fields that are copied from/to the software controlled
> VMCS12 format to/from to processor-specific shadow vmcs. The lists were built
> measuring the VMCS fields access rate after L2 Ubuntu 12.04 booted when it was
> running on top of L1 KVM, also Ubuntu 12.04. Note that during boot there were
> additional fields which were frequently modified but they were not added to
> these lists because after boot these fields were not longer accessed by L1.
>
> Signed-off-by: Abel Gordon <abelg@il.ibm.com>
> ---
> arch/x86/kvm/vmx.c | 75 ++++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 74 insertions(+), 1 deletion(-)
>
> --- .before/arch/x86/kvm/vmx.c 2013-03-10 18:00:54.000000000 +0200
> +++ .after/arch/x86/kvm/vmx.c 2013-03-10 18:00:54.000000000 +0200
> @@ -453,6 +453,51 @@ static inline struct vcpu_vmx *to_vmx(st
> #define FIELD64(number, name) [number] = VMCS12_OFFSET(name), \
> [number##_HIGH] = VMCS12_OFFSET(name)+4
>
> +
> +static const unsigned long shadow_read_only_fields[] = {
> + VM_EXIT_REASON,
> + VM_EXIT_INTR_INFO,
> + VM_EXIT_INSTRUCTION_LEN,
> + IDT_VECTORING_INFO_FIELD,
> + IDT_VECTORING_ERROR_CODE,
> + VM_EXIT_INTR_ERROR_CODE,
> + EXIT_QUALIFICATION,
> + GUEST_LINEAR_ADDRESS,
> + GUEST_PHYSICAL_ADDRESS
> +};
> +static const int max_shadow_read_only_fields = ARRAY_SIZE(shadow_read_only_fields);
> +
> +static const unsigned long shadow_read_write_fields[] = {
> + GUEST_RIP,
> + GUEST_RSP,
> + GUEST_CR0,
> + GUEST_CR3,
> + GUEST_CR4,
> + GUEST_INTERRUPTIBILITY_INFO,
> + GUEST_RFLAGS,
> + GUEST_CS_SELECTOR,
> + GUEST_CS_AR_BYTES,
> + GUEST_CS_LIMIT,
> + GUEST_CS_BASE,
> + GUEST_ES_BASE,
> + CR0_GUEST_HOST_MASK,
> + CR0_READ_SHADOW,
> + CR4_READ_SHADOW,
> + TSC_OFFSET,
> + EXCEPTION_BITMAP,
> + CPU_BASED_VM_EXEC_CONTROL,
> + VM_ENTRY_EXCEPTION_ERROR_CODE,
> + VM_ENTRY_INTR_INFO_FIELD,
> + VM_ENTRY_INSTRUCTION_LEN,
> + VM_ENTRY_EXCEPTION_ERROR_CODE,
> + HOST_FS_BASE,
> + HOST_GS_BASE,
> + HOST_FS_SELECTOR,
> + HOST_GS_SELECTOR
> +};
> +static const int max_shadow_read_write_fields =
> + ARRAY_SIZE(shadow_read_write_fields);
> +
> static const unsigned short vmcs_field_to_offset_table[] = {
> FIELD(VIRTUAL_PROCESSOR_ID, virtual_processor_id),
> FIELD(GUEST_ES_SELECTOR, guest_es_selector),
> @@ -642,6 +687,8 @@ static unsigned long *vmx_msr_bitmap_leg
> static unsigned long *vmx_msr_bitmap_longmode;
> static unsigned long *vmx_msr_bitmap_legacy_x2apic;
> static unsigned long *vmx_msr_bitmap_longmode_x2apic;
> +static unsigned long *vmx_vmread_bitmap;
> +static unsigned long *vmx_vmwrite_bitmap;
>
> static bool cpu_has_load_ia32_efer;
> static bool cpu_has_load_perf_global_ctrl;
> @@ -4033,6 +4080,8 @@ static int vmx_vcpu_setup(struct vcpu_vm
> vmcs_write64(IO_BITMAP_A, __pa(vmx_io_bitmap_a));
> vmcs_write64(IO_BITMAP_B, __pa(vmx_io_bitmap_b));
>
> + vmcs_write64(VMREAD_BITMAP, __pa(vmx_vmread_bitmap));
> + vmcs_write64(VMWRITE_BITMAP, __pa(vmx_vmwrite_bitmap));
Why are you doing it without checking that shadow vmcs is supported and
enabled?
> if (cpu_has_vmx_msr_bitmap())
> vmcs_write64(MSR_BITMAP, __pa(vmx_msr_bitmap_legacy));
>
> @@ -7764,6 +7813,24 @@ static int __init vmx_init(void)
> (unsigned long *)__get_free_page(GFP_KERNEL);
> if (!vmx_msr_bitmap_longmode_x2apic)
> goto out4;
> + vmx_vmread_bitmap = (unsigned long *)__get_free_page(GFP_KERNEL);
> + if (!vmx_vmread_bitmap)
> + goto out4;
> +
> + vmx_vmwrite_bitmap = (unsigned long *)__get_free_page(GFP_KERNEL);
> + if (!vmx_vmwrite_bitmap)
> + goto out5;
> +
We need to cleanup this bitmaps allocations some day to allocate only when the
feature is supported and used.
> + memset(vmx_vmread_bitmap, 0xff, PAGE_SIZE);
> + memset(vmx_vmwrite_bitmap, 0xff, PAGE_SIZE);
> + /* shadowed read/write fields */
> + for (i = 0; i < max_shadow_read_write_fields; i++) {
> + clear_bit(shadow_read_write_fields[i], vmx_vmwrite_bitmap);
> + clear_bit(shadow_read_write_fields[i], vmx_vmread_bitmap);
> + }
> + /* shadowed read only fields */
> + for (i = 0; i < max_shadow_read_only_fields; i++)
> + clear_bit(shadow_read_only_fields[i], vmx_vmread_bitmap);
>
> /*
> * Allow direct access to the PC debug port (it is often used for I/O
> @@ -7782,7 +7849,7 @@ static int __init vmx_init(void)
> r = kvm_init(&vmx_x86_ops, sizeof(struct vcpu_vmx),
> __alignof__(struct vcpu_vmx), THIS_MODULE);
> if (r)
> - goto out3;
> + goto out6;
>
> #ifdef CONFIG_KEXEC
> rcu_assign_pointer(crash_vmclear_loaded_vmcss,
> @@ -7830,6 +7897,10 @@ static int __init vmx_init(void)
>
> return 0;
>
> +out6:
> + free_page((unsigned long)vmx_vmwrite_bitmap);
> +out5:
> + free_page((unsigned long)vmx_vmread_bitmap);
> out4:
> free_page((unsigned long)vmx_msr_bitmap_longmode);
> out3:
> @@ -7851,6 +7922,8 @@ static void __exit vmx_exit(void)
> free_page((unsigned long)vmx_msr_bitmap_longmode);
> free_page((unsigned long)vmx_io_bitmap_b);
> free_page((unsigned long)vmx_io_bitmap_a);
> + free_page((unsigned long)vmx_vmwrite_bitmap);
> + free_page((unsigned long)vmx_vmread_bitmap);
>
> #ifdef CONFIG_KEXEC
> rcu_assign_pointer(crash_vmclear_loaded_vmcss, NULL);
>
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
Gleb.
next prev parent reply other threads:[~2013-04-08 11:51 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-10 16:03 [PATCH 0/11] KVM: nVMX: shadow VMCS support, v1 Abel Gordon
2013-03-10 16:03 ` [PATCH 01/11] KVM: nVMX: Stats counters for nVMX Abel Gordon
2013-04-08 10:27 ` Gleb Natapov
2013-04-10 19:08 ` Abel Gordon
2013-04-11 6:10 ` Gleb Natapov
2013-03-10 16:04 ` [PATCH 02/11] KVM: nVMX: Shadow-vmcs control fields/bits Abel Gordon
2013-03-10 16:04 ` [PATCH 03/11] KVM: nVMX: Detect shadow-vmcs capability Abel Gordon
2013-04-08 11:12 ` Gleb Natapov
2013-04-10 19:14 ` Abel Gordon
2013-03-10 16:05 ` [PATCH 04/11] KVM: nVMX: Introduce vmread and vmwrite bitmaps Abel Gordon
2013-04-08 11:50 ` Gleb Natapov [this message]
2013-04-10 19:14 ` Abel Gordon
2013-03-10 16:05 ` [PATCH 05/11] KVM: nVMX: Refactor handle_vmwrite Abel Gordon
2013-04-09 11:05 ` Gleb Natapov
2013-04-10 20:35 ` Abel Gordon
2013-03-10 16:06 ` [PATCH 06/11] KVM: nVMX: Allocate shadow vmcs Abel Gordon
2013-03-10 16:06 ` [PATCH 07/11] KVM: nVMX: Release " Abel Gordon
2013-03-10 16:07 ` [PATCH 08/11] KVM: nVMX: Copy processor-specific shadow-vmcs to VMCS12 Abel Gordon
2013-03-10 16:07 ` [PATCH 09/11] KVM: nVMX: Copy VMCS12 to processor-specific shadow vmcs Abel Gordon
2013-04-09 12:47 ` Gleb Natapov
2013-04-10 19:15 ` Abel Gordon
2013-03-10 16:08 ` [PATCH 10/11] KVM: nVMX: Synchronize VMCS12 content with the " Abel Gordon
2013-03-10 22:43 ` Nadav Har'El
2013-03-11 7:54 ` Abel Gordon
2013-04-09 13:14 ` Gleb Natapov
2013-04-10 19:15 ` Abel Gordon
2013-04-11 6:54 ` Gleb Natapov
2013-04-12 10:26 ` Abel Gordon
2013-04-12 10:31 ` Gleb Natapov
2013-04-12 10:44 ` Abel Gordon
2013-04-12 10:48 ` Gleb Natapov
2013-04-14 9:51 ` Abel Gordon
2013-04-14 10:00 ` Gleb Natapov
2013-04-14 10:07 ` Gleb Natapov
2013-04-14 10:27 ` Jan Kiszka
2013-04-14 10:34 ` Abel Gordon
2013-04-14 10:34 ` Gleb Natapov
2013-04-14 10:49 ` Abel Gordon
2013-04-14 11:16 ` Gleb Natapov
2013-04-14 13:47 ` Abel Gordon
2013-04-14 14:41 ` Gleb Natapov
2013-03-10 16:08 ` [PATCH 11/11] KVM: nVMX: Enable and disable shadow vmcs functionality Abel Gordon
2013-03-21 12:22 ` [PATCH 0/11] KVM: nVMX: shadow VMCS support, v1 Orit Wasserman
2013-03-21 13:56 ` Abel Gordon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20130408115053.GK17919@redhat.com \
--to=gleb@redhat.com \
--cc=abelg@il.ibm.com \
--cc=dongxiao.xu@intel.com \
--cc=jun.nakajima@intel.com \
--cc=kvm@vger.kernel.org \
--cc=nadav@harel.org.il \
--cc=owasserm@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.