From: "Nadav Har'El" <nyh@math.technion.ac.il>
To: "Tian, Kevin" <kevin.tian@intel.com>
Cc: Avi Kivity <avi@redhat.com>,
Marcelo Tosatti <mtosatti@redhat.com>,
"kvm@vger.kernel.org" <kvm@vger.kernel.org>,
"gleb@redhat.com" <gleb@redhat.com>,
"Roedel, Joerg" <Joerg.Roedel@amd.com>
Subject: Re: [PATCH 08/31] nVMX: Fix local_vcpus_link handling
Date: Tue, 24 May 2011 10:56:56 +0300 [thread overview]
Message-ID: <20110524075656.GA26588@fermat.math.technion.ac.il> (raw)
In-Reply-To: <625BA99ED14B2D499DC4E29D8138F1505C9BEF07A9@shsmsx502.ccr.corp.intel.com>
On Tue, May 24, 2011, Tian, Kevin wrote about "RE: [PATCH 08/31] nVMX: Fix local_vcpus_link handling":
> > +static inline void loaded_vmcs_init(struct loaded_vmcs *loaded_vmcs)
> > +{
> > + vmcs_clear(loaded_vmcs->vmcs);
> > + loaded_vmcs->cpu = -1;
> > + loaded_vmcs->launched = 0;
> > +}
> > +
>
> call it vmcs_init instead since you now remove original vmcs_init invocation,
> which more reflect the necessity of adding VMCLEAR for a new vmcs?
The best name for this function, I think, would have been loaded_vmcs_clear,
because this function isn't necessarily used to "init" - it's also called to
VMCLEAR an old vmcs (and flush its content back to memory) - in that sense
it is definitely not a "vmcs_init".
Unfortunately, I already have a whole chain of functions with this name :(
the existing loaded_vmcs_clear() does an IPI to the CPU which has this VMCS
loaded, and causes it to run __loaded_vmcs_clear(), which in turn calls
the above loaded_vmcs_init(). I wish I could call all three functions
loaded_vmcs_clear(), but of course I can't. If anyone reading this has a good
suggestion on how to name these three functions, please let me know.
> > +static void __loaded_vmcs_clear(void *arg)
> > {
> > - struct vcpu_vmx *vmx = arg;
> > + struct loaded_vmcs *loaded_vmcs = arg;
> > int cpu = raw_smp_processor_id();
> >
> > - if (vmx->vcpu.cpu == cpu)
> > - vmcs_clear(vmx->vmcs);
> > - if (per_cpu(current_vmcs, cpu) == vmx->vmcs)
> > + if (loaded_vmcs->cpu != cpu)
> > + return; /* cpu migration can race with cpu offline */
>
> what do you mean by "cpu migration" here? why does 'cpu offline'
> matter here regarding to the cpu change?
__loaded_vmcs_clear() is typically called in one of two cases: "cpu migration"
means that a guest that used to run on one CPU, and had its VMCS loaded there,
suddenly needs to run on a different CPU, so we need to clear the VMCS on
the old CPU. "cpu offline" means that we want to take a certain CPU offline,
and before we do that we should VMCLEAR all VMCSs which were loaded on it.
The (vmx->cpu.cpu != cpu) case in __loaded_vmcs_clear should ideally never
happen: In the cpu offline path, we only call it for the loaded_vmcss which
we know for sure are loaded on the current cpu. In the cpu migration path,
loaded_vmcs_clear runs __loaded_vmcs_clear on the right CPU, which ensures that
equality.
But, there can be a race condition (this was actually explained to me a while
back by Avi - I never seen this happening in practice): Imagine that cpu
migration calls loaded_vmcs_clear, which tells the old cpu (via IPI) to
VMCLEAR this vmcs. But before that old CPU gets a chance to act on that IPI,
a decision is made to take it offline, and all loaded_vmcs loaded on it
(including the one in question) are cleared. When that CPU acts on this IPI,
it notices that vmx->cpu.cpu==-1, i.e., != cpu, so it doesn't need to do
anything (in the new version of the code, I made this more explicit, by
returning immediately in this case).
At least this is the theory. As I said, I didn't see this problem in practice
(unsurprising, since I never offlined any CPU). Maybe Avi or someone else can
comment more about this (vmx->cpu.cpu == cpu) check, which existed before
my patch - in __vcpu_clear().
> > +static void free_loaded_vmcs(struct loaded_vmcs *loaded_vmcs)
> > +{
> > + if (!loaded_vmcs->vmcs)
> > + return;
> > + loaded_vmcs_clear(loaded_vmcs);
> > + free_vmcs(loaded_vmcs->vmcs);
> > + loaded_vmcs->vmcs = NULL;
> > +}
>
> prefer to not do cleanup work through loaded_vmcs since it's just a pointer
> to a loaded vmcs structure. Though you can carefully arrange the nested
> vmcs cleanup happening before it, it's not very clean and a bit error prone
> simply from this function itself. It's clearer to directly cleanup vmcs01, and
> if you want an assertion could be added to make sure loaded_vmcs doesn't
> point to any stale vmcs02 structure after nested cleanup step.
I'm afraid I didn't understand what you meant here... Basically, this
free_loaded_vmcs() is just a shortcut for loaded_vmcs_clear() and free_vmcs(),
as doing both is needed in 3 places: nested_free_vmcs02,
nested_free_all_saved_vmcss, vmx_free_vcpu. The same function is needed
for both vmcs01 and vmcs02 VMCSs - in both cases when we don't need them any
more we need to VMCLEAR them and then free the VMCS memory. Note that this
function does *not* free the loaded_vmcs structure itself.
What's wrong with this?
Would you prefer that I remove this function and explictly call
loaded_vmcs_clear() and then free_vmcs() in all three places?
Thanks,
Nadav.
--
Nadav Har'El | Tuesday, May 24 2011, 20 Iyyar 5771
nyh@math.technion.ac.il |-----------------------------------------
Phone +972-523-790466, ICQ 13349191 |Linux: Because a PC is a terrible thing
http://nadav.harel.org.il |to waste.
next prev parent reply other threads:[~2011-05-24 7:57 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
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 [this message]
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=20110524075656.GA26588@fermat.math.technion.ac.il \
--to=nyh@math.technion.ac.il \
--cc=Joerg.Roedel@amd.com \
--cc=avi@redhat.com \
--cc=gleb@redhat.com \
--cc=kevin.tian@intel.com \
--cc=kvm@vger.kernel.org \
--cc=mtosatti@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.