From: Avi Kivity <avi@redhat.com>
To: "Nadav Har'El" <nyh@math.technion.ac.il>
Cc: Marcelo Tosatti <mtosatti@redhat.com>,
kvm@vger.kernel.org, gleb@redhat.com, "Roedel,
Joerg" <Joerg.Roedel@amd.com>
Subject: Re: [PATCH 08/31] nVMX: Fix local_vcpus_link handling
Date: Mon, 23 May 2011 18:49:17 +0300 [thread overview]
Message-ID: <4DDA81FD.5050203@redhat.com> (raw)
In-Reply-To: <20110522085732.GB1116@fermat.math.technion.ac.il>
On 05/22/2011 11:57 AM, Nadav Har'El wrote:
> Hi Avi and Marcelo, here is a the new first patch to the nvmx patch set,
> which overhauls the handling of vmcss on cpus, as you asked.
>
> As you guessed, the nested entry and exit code becomes much simpler and
> cleaner, with the whole VMCS switching code on entry, for example, reduced
> to:
> cpu = get_cpu();
> vmx->loaded_vmcs = vmcs02;
> vmx_vcpu_put(vcpu);
> vmx_vcpu_load(vcpu, cpu);
> vcpu->cpu = cpu;
> put_cpu();
That's wonderful, it indicates the code is much better integrated.
Perhaps later we can refine it to have separate _load and _put for
host-related and guest-related parts (I think they already exist in the
code, except they are always called together), but that is an
optimization, and not the most important one by far.
> You can apply this patch separately from the rest of the patch set, if you
> wish. I'm sending just this one, like you asked - and can send the rest of
> the patches when you ask me to.
>
>
> Subject: [PATCH 01/31] nVMX: Keep list of loaded VMCSs, instead of vcpus.
>
> In VMX, before we bring down a CPU we must VMCLEAR all VMCSs loaded on it
> because (at least in theory) the processor might not have written all of its
> content back to memory. Since a patch from June 26, 2008, this is done using
> a per-cpu "vcpus_on_cpu" linked list of vcpus loaded on each CPU.
>
> The problem is that with nested VMX, we no longer have the concept of a
> vcpu being loaded on a cpu: A vcpu has multiple VMCSs (one for L1, a pool for
> L2s), and each of those may be have been last loaded on a different cpu.
>
> So instead of linking the vcpus, we link the VMCSs, using a new structure
> loaded_vmcs. This structure contains the VMCS, and the information pertaining
> to its loading on a specific cpu (namely, the cpu number, and whether it
> was already launched on this cpu once). In nested we will also use the same
> structure to hold L2 VMCSs, and vmx->loaded_vmcs is a pointer to the
> currently active VMCS.
>
> --- .before/arch/x86/kvm/x86.c 2011-05-22 11:41:57.000000000 +0300
> +++ .after/arch/x86/kvm/x86.c 2011-05-22 11:41:57.000000000 +0300
> @@ -2119,7 +2119,8 @@ void kvm_arch_vcpu_load(struct kvm_vcpu
> if (need_emulate_wbinvd(vcpu)) {
> if (kvm_x86_ops->has_wbinvd_exit())
> cpumask_set_cpu(cpu, vcpu->arch.wbinvd_dirty_mask);
> - else if (vcpu->cpu != -1&& vcpu->cpu != cpu)
> + else if (vcpu->cpu != -1&& vcpu->cpu != cpu
> + && cpu_online(vcpu->cpu))
> smp_call_function_single(vcpu->cpu,
> wbinvd_ipi, NULL, 1);
> }
Is this a necessary part of this patch? Or an semi-related bugfix?
I think that it can't actually trigger before this patch due to luck.
svm doesn't clear vcpu->cpu on cpu offline, but on the other hand it
->has_wbinvd_exit().
Joerg, is
if (unlikely(cpu != vcpu->cpu)) {
svm->asid_generation = 0;
mark_all_dirty(svm->vmcb);
}
susceptible to cpu offline/online?
> @@ -971,22 +992,22 @@ static void vmx_vcpu_load(struct kvm_vcp
>
> if (!vmm_exclusive)
> kvm_cpu_vmxon(phys_addr);
> - else if (vcpu->cpu != cpu)
> - vcpu_clear(vmx);
> + else if (vmx->loaded_vmcs->cpu != cpu)
> + loaded_vmcs_clear(vmx->loaded_vmcs);
>
> - if (per_cpu(current_vmcs, cpu) != vmx->vmcs) {
> - per_cpu(current_vmcs, cpu) = vmx->vmcs;
> - vmcs_load(vmx->vmcs);
> + if (per_cpu(current_vmcs, cpu) != vmx->loaded_vmcs->vmcs) {
> + per_cpu(current_vmcs, cpu) = vmx->loaded_vmcs->vmcs;
> + vmcs_load(vmx->loaded_vmcs->vmcs);
> }
>
> - if (vcpu->cpu != cpu) {
> + if (vmx->loaded_vmcs->cpu != cpu) {
> struct desc_ptr *gdt =&__get_cpu_var(host_gdt);
> unsigned long sysenter_esp;
>
> kvm_make_request(KVM_REQ_TLB_FLUSH, vcpu);
> local_irq_disable();
> - list_add(&vmx->local_vcpus_link,
> - &per_cpu(vcpus_on_cpu, cpu));
> + list_add(&vmx->loaded_vmcs->loaded_vmcss_on_cpu_link,
> + &per_cpu(loaded_vmcss_on_cpu, cpu));
> local_irq_enable();
>
> /*
> @@ -999,13 +1020,15 @@ static void vmx_vcpu_load(struct kvm_vcp
> rdmsrl(MSR_IA32_SYSENTER_ESP, sysenter_esp);
> vmcs_writel(HOST_IA32_SYSENTER_ESP, sysenter_esp); /* 22.2.3 */
> }
> + vmx->loaded_vmcs->cpu = cpu;
This should be within the if () block.
> @@ -4344,11 +4369,13 @@ static struct kvm_vcpu *vmx_create_vcpu(
> goto uninit_vcpu;
> }
>
> - vmx->vmcs = alloc_vmcs();
> - if (!vmx->vmcs)
> + vmx->loaded_vmcs =&vmx->vmcs01;
> + vmx->loaded_vmcs->vmcs = alloc_vmcs();
> + if (!vmx->loaded_vmcs->vmcs)
> goto free_msrs;
> -
> - vmcs_init(vmx->vmcs);
> + vmcs_init(vmx->loaded_vmcs->vmcs);
> + vmx->loaded_vmcs->cpu = -1;
> + vmx->loaded_vmcs->launched = 0;
Perhaps a loaded_vmcs_init() to encapsulate initialization of these
three fields, you'll probably reuse it later.
Please repost separately after the fix, I'd like to apply it before the
rest of the series.
(regarding interrupts, I think we can do that work post-merge. But I'd
like to see Kevin's comments addressed)
--
error compiling committee.c: too many arguments to function
next prev parent reply other threads:[~2011-05-23 15:49 UTC|newest]
Thread overview: 118+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-05-16 19:43 [PATCH 0/31] nVMX: Nested VMX, v10 Nadav Har'El
2011-05-16 19:44 ` [PATCH 01/31] nVMX: Add "nested" module option to kvm_intel Nadav Har'El
2011-05-16 19:44 ` [PATCH 02/31] nVMX: Implement VMXON and VMXOFF Nadav Har'El
2011-05-20 7:58 ` Tian, Kevin
2011-05-16 19:45 ` [PATCH 03/31] nVMX: Allow setting the VMXE bit in CR4 Nadav Har'El
2011-05-16 19:45 ` [PATCH 04/31] nVMX: Introduce vmcs12: a VMCS structure for L1 Nadav Har'El
2011-05-16 19:46 ` [PATCH 05/31] nVMX: Implement reading and writing of VMX MSRs Nadav Har'El
2011-05-16 19:46 ` [PATCH 06/31] nVMX: Decoding memory operands of VMX instructions Nadav Har'El
2011-05-16 19:47 ` [PATCH 07/31] nVMX: Introduce vmcs02: VMCS used to run L2 Nadav Har'El
2011-05-20 8:04 ` Tian, Kevin
2011-05-20 8:48 ` Tian, Kevin
2011-05-20 20:32 ` Nadav Har'El
2011-05-22 2:00 ` Tian, Kevin
2011-05-22 7:22 ` Nadav Har'El
2011-05-24 0:54 ` Tian, Kevin
2011-05-22 8:29 ` Nadav Har'El
2011-05-24 1:03 ` Tian, Kevin
2011-05-16 19:48 ` [PATCH 08/31] nVMX: Fix local_vcpus_link handling Nadav Har'El
2011-05-17 13:19 ` Marcelo Tosatti
2011-05-17 13:35 ` Avi Kivity
2011-05-17 14:35 ` Nadav Har'El
2011-05-17 14:42 ` Marcelo Tosatti
2011-05-17 17:57 ` Nadav Har'El
2011-05-17 15:11 ` Avi Kivity
2011-05-17 18:11 ` Nadav Har'El
2011-05-17 18:43 ` Marcelo Tosatti
2011-05-17 19:30 ` Nadav Har'El
2011-05-17 19:52 ` Marcelo Tosatti
2011-05-18 5:52 ` Nadav Har'El
2011-05-18 8:31 ` Avi Kivity
2011-05-18 9:02 ` Nadav Har'El
2011-05-18 9:16 ` Avi Kivity
2011-05-18 12:08 ` Marcelo Tosatti
2011-05-18 12:19 ` Nadav Har'El
2011-05-22 8:57 ` Nadav Har'El
2011-05-23 15:49 ` Avi Kivity [this message]
2011-05-23 16:17 ` Gleb Natapov
2011-05-23 18:59 ` Nadav Har'El
2011-05-23 19:03 ` Gleb Natapov
2011-05-23 16:43 ` Roedel, Joerg
2011-05-23 16:51 ` Avi Kivity
2011-05-24 9:22 ` Roedel, Joerg
2011-05-24 9:28 ` Nadav Har'El
2011-05-24 9:57 ` Roedel, Joerg
2011-05-24 10:08 ` Avi Kivity
2011-05-24 10:12 ` Nadav Har'El
2011-05-23 18:51 ` Nadav Har'El
2011-05-24 2:22 ` Tian, Kevin
2011-05-24 7:56 ` Nadav Har'El
2011-05-24 8:20 ` Tian, Kevin
2011-05-24 11:05 ` Avi Kivity
2011-05-24 11:20 ` Tian, Kevin
2011-05-24 11:27 ` Avi Kivity
2011-05-24 11:30 ` Tian, Kevin
2011-05-24 11:36 ` Avi Kivity
2011-05-24 11:40 ` Tian, Kevin
2011-05-24 11:59 ` Nadav Har'El
2011-05-24 0:57 ` Tian, Kevin
2011-05-18 8:29 ` Avi Kivity
2011-05-16 19:48 ` [PATCH 09/31] nVMX: Add VMCS fields to the vmcs12 Nadav Har'El
2011-05-20 8:22 ` Tian, Kevin
2011-05-16 19:49 ` [PATCH 10/31] nVMX: Success/failure of VMX instructions Nadav Har'El
2011-05-16 19:49 ` [PATCH 11/31] nVMX: Implement VMCLEAR Nadav Har'El
2011-05-16 19:50 ` [PATCH 12/31] nVMX: Implement VMPTRLD Nadav Har'El
2011-05-16 19:50 ` [PATCH 13/31] nVMX: Implement VMPTRST Nadav Har'El
2011-05-16 19:51 ` [PATCH 14/31] nVMX: Implement VMREAD and VMWRITE Nadav Har'El
2011-05-16 19:51 ` [PATCH 15/31] nVMX: Move host-state field setup to a function Nadav Har'El
2011-05-16 19:52 ` [PATCH 16/31] nVMX: Move control field setup to functions Nadav Har'El
2011-05-16 19:52 ` [PATCH 17/31] nVMX: Prepare vmcs02 from vmcs01 and vmcs12 Nadav Har'El
2011-05-24 8:02 ` Tian, Kevin
2011-05-24 9:19 ` Nadav Har'El
2011-05-24 10:52 ` Tian, Kevin
2011-05-16 19:53 ` [PATCH 18/31] nVMX: Implement VMLAUNCH and VMRESUME Nadav Har'El
2011-05-24 8:45 ` Tian, Kevin
2011-05-24 9:45 ` Nadav Har'El
2011-05-24 10:54 ` Tian, Kevin
2011-05-25 8:00 ` Tian, Kevin
2011-05-25 13:26 ` Nadav Har'El
2011-05-26 0:42 ` Tian, Kevin
2011-05-16 19:53 ` [PATCH 19/31] nVMX: No need for handle_vmx_insn function any more Nadav Har'El
2011-05-16 19:54 ` [PATCH 20/31] nVMX: Exiting from L2 to L1 Nadav Har'El
2011-05-24 12:58 ` Tian, Kevin
2011-05-24 13:43 ` Nadav Har'El
2011-05-25 0:55 ` Tian, Kevin
2011-05-25 8:06 ` Nadav Har'El
2011-05-25 8:23 ` Tian, Kevin
2011-05-25 2:43 ` Tian, Kevin
2011-05-25 13:21 ` Nadav Har'El
2011-05-26 0:41 ` Tian, Kevin
2011-05-16 19:54 ` [PATCH 21/31] nVMX: vmcs12 checks on nested entry Nadav Har'El
2011-05-25 3:01 ` Tian, Kevin
2011-05-25 5:38 ` Nadav Har'El
2011-05-25 7:33 ` Tian, Kevin
2011-05-16 19:55 ` [PATCH 22/31] nVMX: Deciding if L0 or L1 should handle an L2 exit Nadav Har'El
2011-05-25 7:56 ` Tian, Kevin
2011-05-25 13:45 ` Nadav Har'El
2011-05-16 19:55 ` [PATCH 23/31] nVMX: Correct handling of interrupt injection Nadav Har'El
2011-05-25 8:39 ` Tian, Kevin
2011-05-25 8:45 ` Tian, Kevin
2011-05-25 10:56 ` Nadav Har'El
2011-05-25 9:18 ` Tian, Kevin
2011-05-25 12:33 ` Nadav Har'El
2011-05-25 12:55 ` Tian, Kevin
2011-05-16 19:56 ` [PATCH 24/31] nVMX: Correct handling of exception injection Nadav Har'El
2011-05-16 19:56 ` [PATCH 25/31] nVMX: Correct handling of idt vectoring info Nadav Har'El
2011-05-25 10:02 ` Tian, Kevin
2011-05-25 10:13 ` Nadav Har'El
2011-05-25 10:17 ` Tian, Kevin
2011-05-16 19:57 ` [PATCH 26/31] nVMX: Handling of CR0 and CR4 modifying instructions Nadav Har'El
2011-05-16 19:57 ` [PATCH 27/31] nVMX: Further fixes for lazy FPU loading Nadav Har'El
2011-05-16 19:58 ` [PATCH 28/31] nVMX: Additional TSC-offset handling Nadav Har'El
2011-05-16 19:58 ` [PATCH 29/31] nVMX: Add VMX to list of supported cpuid features Nadav Har'El
2011-05-16 19:59 ` [PATCH 30/31] nVMX: Miscellenous small corrections Nadav Har'El
2011-05-16 19:59 ` [PATCH 31/31] nVMX: Documentation Nadav Har'El
2011-05-25 10:33 ` Tian, Kevin
2011-05-25 11:54 ` Nadav Har'El
2011-05-25 12:11 ` Tian, Kevin
2011-05-25 12:13 ` Muli Ben-Yehuda
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=4DDA81FD.5050203@redhat.com \
--to=avi@redhat.com \
--cc=Joerg.Roedel@amd.com \
--cc=gleb@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=mtosatti@redhat.com \
--cc=nyh@math.technion.ac.il \
/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.