From: Avi Kivity <avi@redhat.com>
To: "Nadav Har'El" <nyh@il.ibm.com>
Cc: kvm@vger.kernel.org, gleb@redhat.com
Subject: Re: [PATCH 08/28] nVMX: Hold a vmcs02 for each vmcs12
Date: Thu, 09 Dec 2010 14:41:37 +0200 [thread overview]
Message-ID: <4D00CE81.5050808@redhat.com> (raw)
In-Reply-To: <201012081704.oB8H43i2008629@rice.haifa.ibm.com>
On 12/08/2010 07:04 PM, Nadav Har'El wrote:
> In this patch we add a list of L0 (hardware) VMCSs, which we'll use to hold a
> hardware VMCS for each active vmcs12 (i.e., for each L2 guest).
>
> We call each of these L0 VMCSs a "vmcs02", as it is the VMCS that L0 uses
> to run its nested guest L2.
>
> Signed-off-by: Nadav Har'El<nyh@il.ibm.com>
> ---
> arch/x86/kvm/vmx.c | 96 +++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 96 insertions(+)
>
> --- .before/arch/x86/kvm/vmx.c 2010-12-08 18:56:49.000000000 +0200
> +++ .after/arch/x86/kvm/vmx.c 2010-12-08 18:56:49.000000000 +0200
> @@ -155,6 +155,12 @@ struct __packed vmcs12 {
> */
> #define VMCS12_REVISION 0x11e57ed0
>
> +struct vmcs_list {
> + struct list_head list;
> + gpa_t vmcs12_addr;
> + struct vmcs *vmcs02;
> +};
> +
> /*
> * The nested_vmx structure is part of vcpu_vmx, and holds information we need
> * for correct emulation of VMX (i.e., nested VMX) on this vcpu. For example,
> @@ -170,6 +176,10 @@ struct nested_vmx {
> /* The host-usable pointer to the above */
> struct page *current_vmcs12_page;
> struct vmcs12 *current_vmcs12;
> +
> + /* list of real (hardware) VMCS, one for each L2 guest of L1 */
> + struct list_head vmcs02_list; /* a vmcs_list */
> + int vmcs02_num;
> };
>
> struct vcpu_vmx {
> @@ -1736,6 +1746,85 @@ static void free_vmcs(struct vmcs *vmcs)
> free_pages((unsigned long)vmcs, vmcs_config.order);
> }
>
> +static struct vmcs *nested_get_current_vmcs(struct kvm_vcpu *vcpu)
> +{
> + struct vcpu_vmx *vmx = to_vmx(vcpu);
> + struct vmcs_list *list_item, *n;
> +
> + list_for_each_entry_safe(list_item, n,&vmx->nested.vmcs02_list, list)
> + if (list_item->vmcs12_addr == vmx->nested.current_vmptr)
> + return list_item->vmcs02;
> +
> + return NULL;
> +}
> +
> +/*
> + * Allocate an L0 VMCS (vmcs02) for the current L1 VMCS (vmcs12), if one
> + * does not already exist. The allocation is done in L0 memory, so to avoid
> + * denial-of-service attack by guests, we limit the number of concurrently-
> + * allocated vmcss. A well-behaving L1 will VMCLEAR unused vmcs12s and not
> + * trigger this limit.
> + */
> +static const int NESTED_MAX_VMCS = 256;
> +static int nested_create_current_vmcs(struct kvm_vcpu *vcpu)
> +{
> + struct vmcs_list *new_l2_guest;
> + struct vmcs *vmcs02;
> +
> + if (nested_get_current_vmcs(vcpu))
> + return 0; /* nothing to do - we already have a VMCS */
> +
> + if (to_vmx(vcpu)->nested.vmcs02_num>= NESTED_MAX_VMCS)
> + return -ENOMEM;
I asked for this to be fixed (say by freeing one vmcs02 from the list).
The guest can easily crash by running a lot of nested guests.
Actually you don't have to free it, simply reuse it for the new vmcs12.
> +
> + new_l2_guest = (struct vmcs_list *)
> + kmalloc(sizeof(struct vmcs_list), GFP_KERNEL);
> + if (!new_l2_guest)
> + return -ENOMEM;
> +
> + vmcs02 = alloc_vmcs();
> + if (!vmcs02) {
> + kfree(new_l2_guest);
> + return -ENOMEM;
> + }
> +
> + new_l2_guest->vmcs12_addr = to_vmx(vcpu)->nested.current_vmptr;
> + new_l2_guest->vmcs02 = vmcs02;
> + list_add(&(new_l2_guest->list),&(to_vmx(vcpu)->nested.vmcs02_list));
> + to_vmx(vcpu)->nested.vmcs02_num++;
> + return 0;
> +}
> +
--
error compiling committee.c: too many arguments to function
next prev parent reply other threads:[~2010-12-09 12:41 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-12-08 16:59 [PATCH 0/28] nVMX: Nested VMX, v7 Nadav Har'El
2010-12-08 17:00 ` [PATCH 01/28] nVMX: Add "nested" module option to vmx.c Nadav Har'El
2010-12-08 17:00 ` [PATCH 02/28] nVMX: Add VMX and SVM to list of supported cpuid features Nadav Har'El
2010-12-09 11:38 ` Joerg Roedel
2010-12-15 13:25 ` Nadav Har'El
2010-12-08 17:01 ` [PATCH 03/28] nVMX: Implement VMXON and VMXOFF Nadav Har'El
2010-12-08 17:02 ` [PATCH 04/28] nVMX: Allow setting the VMXE bit in CR4 Nadav Har'El
2010-12-08 17:02 ` [PATCH 05/28] nVMX: Introduce vmcs12: a VMCS structure for L1 Nadav Har'El
2010-12-08 17:03 ` [PATCH 06/28] nVMX: Implement reading and writing of VMX MSRs Nadav Har'El
2010-12-09 11:04 ` Avi Kivity
2010-12-08 17:03 ` [PATCH 07/28] nVMX: Decoding memory operands of VMX instructions Nadav Har'El
2010-12-09 11:08 ` Avi Kivity
2010-12-08 17:04 ` [PATCH 08/28] nVMX: Hold a vmcs02 for each vmcs12 Nadav Har'El
2010-12-09 12:41 ` Avi Kivity [this message]
2010-12-08 17:04 ` [PATCH 09/28] nVMX: Add VMCS fields to the vmcs12 Nadav Har'El
2010-12-09 12:43 ` Avi Kivity
2010-12-10 12:10 ` Nadav Har'El
2010-12-08 17:05 ` [PATCH 10/28] nVMX: Success/failure of VMX instructions Nadav Har'El
2010-12-08 17:05 ` [PATCH 11/28] nVMX: Implement VMCLEAR Nadav Har'El
2010-12-08 17:06 ` [PATCH 12/28] nVMX: Implement VMPTRLD Nadav Har'El
2010-12-08 17:06 ` [PATCH 13/28] nVMX: Implement VMPTRST Nadav Har'El
2010-12-08 17:07 ` [PATCH 14/28] nVMX: Implement VMREAD and VMWRITE Nadav Har'El
2010-12-08 17:07 ` [PATCH 15/28] nVMX: Prepare vmcs02 from vmcs01 and vmcs12 Nadav Har'El
2010-12-08 17:08 ` [PATCH 16/28] nVMX: Move register-syncing to a function Nadav Har'El
2010-12-08 17:08 ` [PATCH 17/28] nVMX: Implement VMLAUNCH and VMRESUME Nadav Har'El
2010-12-08 17:09 ` [PATCH 18/28] nVMX: No need for handle_vmx_insn function any more Nadav Har'El
2010-12-08 17:09 ` [PATCH 19/28] nVMX: Exiting from L2 to L1 Nadav Har'El
2010-12-09 12:55 ` Avi Kivity
2010-12-08 17:10 ` [PATCH 20/28] nVMX: Deciding if L0 or L1 should handle an L2 exit Nadav Har'El
2010-12-08 17:10 ` [PATCH 21/28] nVMX: Correct handling of interrupt injection Nadav Har'El
2010-12-08 17:11 ` [PATCH 22/28] nVMX: Correct handling of exception injection Nadav Har'El
2010-12-08 17:11 ` [PATCH 23/28] nVMX: Correct handling of idt vectoring info Nadav Har'El
2010-12-08 17:12 ` [PATCH 24/28] nVMX: Handling of CR0 and CR4 modifying instructions Nadav Har'El
2010-12-09 13:19 ` Avi Kivity
2010-12-08 17:12 ` [PATCH 25/28] nVMX: Further fixes for lazy FPU loading Nadav Har'El
2010-12-09 13:05 ` Avi Kivity
2010-12-08 17:13 ` [PATCH 26/28] nVMX: Additional TSC-offset handling Nadav Har'El
2010-12-08 17:13 ` [PATCH 27/28] nVMX: Miscellenous small corrections Nadav Har'El
2010-12-08 17:14 ` [PATCH 28/28] nVMX: Documentation Nadav Har'El
2010-12-09 12:44 ` [PATCH 0/28] nVMX: Nested VMX, v7 Avi Kivity
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=4D00CE81.5050808@redhat.com \
--to=avi@redhat.com \
--cc=gleb@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=nyh@il.ibm.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.