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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).