Re: [Xen-devel] Ping: [PATCH] VMX: sync CPU state upon vCPU destruction
>>> On 21.11.17 at 18:00,wrote: > On Tue, 2017-11-21 at 08:29 -0700, Jan Beulich wrote: >> > > > On 21.11.17 at 15:07, wrote: >> > >> > On 21/11/17 13:22, Jan Beulich wrote: >> > > > > > On 09.11.17 at 15:49, wrote: >> > > > >> > > > See the code comment being added for why we need this. >> > > > >> > > > Reported-by: Igor Druzhinin >> > > > Signed-off-by: Jan Beulich >> > > >> > > I realize we aren't settled yet on where to put the sync call. The >> > > discussion appears to have stalled, though. Just to recap, >> > > alternatives to the placement below are >> > > - at the top of complete_domain_destroy(), being the specific >> > > RCU callback exhibiting the problem (others are unlikely to >> > > touch guest state) >> > > - in rcu_do_batch(), paralleling the similar call from >> > > do_tasklet_work() >> > >> > rcu_do_batch() sounds better to me. As I said before I think that the >> > problem is general for the hypervisor (not for VMX only) and might >> > appear in other places as well. >> >> The question here is: In what other cases do we expect an RCU >> callback to possibly touch guest state? I think the common use is >> to merely free some memory in a delayed fashion. >> >> > Those choices that you outlined appear to be different in terms whether >> > we solve the general problem and probably have some minor performance >> > impact or we solve the ad-hoc problem but make the system more >> > entangled. Here I'm more inclined to the first choice because this >> > particular scenario the performance impact should be negligible. >> >> For the problem at hand there's no question about a >> performance effect. The question is whether doing this for _other_ >> RCU callbacks would introduce a performance drop in certain cases. > > So what are performance implications of my original suggestion of > removing !v->is_running check from vmx_ctxt_switch_from() ? > From what I can see: > > 1. Another field in struct vcpu will be checked instead (vmcs_pa) > 2. Additionally this_cpu(current_vmcs) will be loaded, which shouldn't >be terrible, given how heavy a context switch already is. There are no performance implications afaict; I'm simply of the opinion this is not the way the issue should be addressed. The sync approach seems much more natural to me. Jan ___ Xen-devel mailing list Xen-devel@lists.xen.org https://lists.xen.org/xen-devel
Re: [Xen-devel] Ping: [PATCH] VMX: sync CPU state upon vCPU destruction
On Tue, 2017-11-21 at 08:29 -0700, Jan Beulich wrote: > > > > On 21.11.17 at 15:07,wrote: > > > > On 21/11/17 13:22, Jan Beulich wrote: > > > > > > On 09.11.17 at 15:49, wrote: > > > > > > > > See the code comment being added for why we need this. > > > > > > > > Reported-by: Igor Druzhinin > > > > Signed-off-by: Jan Beulich > > > > > > I realize we aren't settled yet on where to put the sync call. The > > > discussion appears to have stalled, though. Just to recap, > > > alternatives to the placement below are > > > - at the top of complete_domain_destroy(), being the specific > > > RCU callback exhibiting the problem (others are unlikely to > > > touch guest state) > > > - in rcu_do_batch(), paralleling the similar call from > > > do_tasklet_work() > > > > rcu_do_batch() sounds better to me. As I said before I think that the > > problem is general for the hypervisor (not for VMX only) and might > > appear in other places as well. > > The question here is: In what other cases do we expect an RCU > callback to possibly touch guest state? I think the common use is > to merely free some memory in a delayed fashion. > > > Those choices that you outlined appear to be different in terms whether > > we solve the general problem and probably have some minor performance > > impact or we solve the ad-hoc problem but make the system more > > entangled. Here I'm more inclined to the first choice because this > > particular scenario the performance impact should be negligible. > > For the problem at hand there's no question about a > performance effect. The question is whether doing this for _other_ > RCU callbacks would introduce a performance drop in certain cases. So what are performance implications of my original suggestion of removing !v->is_running check from vmx_ctxt_switch_from() ? From what I can see: 1. Another field in struct vcpu will be checked instead (vmcs_pa) 2. Additionally this_cpu(current_vmcs) will be loaded, which shouldn't be terrible, given how heavy a context switch already is. -- Thanks, Sergey ___ Xen-devel mailing list Xen-devel@lists.xen.org https://lists.xen.org/xen-devel
Re: [Xen-devel] Ping: [PATCH] VMX: sync CPU state upon vCPU destruction
On 11/21/2017 04:42 PM, Dario Faggioli wrote: > On Tue, 2017-11-21 at 08:29 -0700, Jan Beulich wrote: > On 21.11.17 at 15:07,wrote: >>> >> The question here is: In what other cases do we expect an RCU >> callback to possibly touch guest state? I think the common use is >> to merely free some memory in a delayed fashion. >> >>> Those choices that you outlined appear to be different in terms >>> whether >>> we solve the general problem and probably have some minor >>> performance >>> impact or we solve the ad-hoc problem but make the system more >>> entangled. Here I'm more inclined to the first choice because this >>> particular scenario the performance impact should be negligible. >> >> For the problem at hand there's no question about a >> performance effect. The question is whether doing this for _other_ >> RCU callbacks would introduce a performance drop in certain cases. >> > Well, I personally favour the approach of making the piece of code that > plays with the context responsible of not messing up when doing so. > > And (replying to Igor comment above), I don't think that syncing > context before RCU handlers solves the general problem --as you're > calling it-- of "VMX code asynchronously messing up with the context". > In fzct, it solves the specific problem of "VMX code called via RCU, > asynchronously messing up with the context". > There may be other places where (VMX?) code messes with context, *not* > from within an RCU handler, and that would still be an issue. Yes, to expand on what I said earlier: Given that we cannot (at least between now and the release) make it so that developers *never* have to think about syncing state, it seems like the best thing to do is to make coders *always* think about syncing state. Syncing always in the RCU handler means coders can get away sometimes without syncing; which makes it more likely we'll forget in some other circumstance where it matters. But that's my take on general principles; like Dario I wouldn't argue too strongly if someone felt differently. -George ___ Xen-devel mailing list Xen-devel@lists.xen.org https://lists.xen.org/xen-devel
Re: [Xen-devel] Ping: [PATCH] VMX: sync CPU state upon vCPU destruction
On Tue, 2017-11-21 at 08:29 -0700, Jan Beulich wrote: > > > > On 21.11.17 at 15:07,wrote: > > > The question here is: In what other cases do we expect an RCU > callback to possibly touch guest state? I think the common use is > to merely free some memory in a delayed fashion. > > > Those choices that you outlined appear to be different in terms > > whether > > we solve the general problem and probably have some minor > > performance > > impact or we solve the ad-hoc problem but make the system more > > entangled. Here I'm more inclined to the first choice because this > > particular scenario the performance impact should be negligible. > > For the problem at hand there's no question about a > performance effect. The question is whether doing this for _other_ > RCU callbacks would introduce a performance drop in certain cases. > Well, I personally favour the approach of making the piece of code that plays with the context responsible of not messing up when doing so. And (replying to Igor comment above), I don't think that syncing context before RCU handlers solves the general problem --as you're calling it-- of "VMX code asynchronously messing up with the context". In fzct, it solves the specific problem of "VMX code called via RCU, asynchronously messing up with the context". There may be other places where (VMX?) code messes with context, *not* from within an RCU handler, and that would still be an issue. All that being said, given the nature of RCUs themselves, and given the "precedent" we have for tasklets, I don't think it's a problem to sync the state in rcu_do_batch(). Looking at users of call_rcu() (and trying to follow the call chains), I think the only occasion where there may be an impact on perf, would be when it's used in del_msixtbl_entry() (e.g., when that is called by msixtbl_pt_unregister())... but I'm not familiar with that area of code, so I may very well be wrong. So, to summarize, if it were me doing this, I'd sync either in vmx_vcpu_destroy() or in complete_domain_destroy(). But (for what it's worth) I'm fine with it happening in rcu_do_batch(). Regards, Dario -- <> (Raistlin Majere) - Dario Faggioli, Ph.D, http://about.me/dario.faggioli signature.asc Description: This is a digitally signed message part ___ Xen-devel mailing list Xen-devel@lists.xen.org https://lists.xen.org/xen-devel
Re: [Xen-devel] Ping: [PATCH] VMX: sync CPU state upon vCPU destruction
On 11/21/2017 01:22 PM, Jan Beulich wrote: On 09.11.17 at 15:49,wrote: >> See the code comment being added for why we need this. >> >> Reported-by: Igor Druzhinin >> Signed-off-by: Jan Beulich > > I realize we aren't settled yet on where to put the sync call. The > discussion appears to have stalled, though. Just to recap, > alternatives to the placement below are > - at the top of complete_domain_destroy(), being the specific > RCU callback exhibiting the problem (others are unlikely to > touch guest state) > - in rcu_do_batch(), paralleling the similar call from > do_tasklet_work() I read through the discussion yesterday without digging into the code. At the moment, I'd say that specific code needing to touch potentially non-sync'd state should be marked to sync it, rather than syncing it all the time. But I don't have a strong opinion (particularly as I haven't dug into the code). -George ___ Xen-devel mailing list Xen-devel@lists.xen.org https://lists.xen.org/xen-devel
Re: [Xen-devel] Ping: [PATCH] VMX: sync CPU state upon vCPU destruction
On 21/11/17 15:29, Jan Beulich wrote: On 21.11.17 at 15:07,wrote: >> On 21/11/17 13:22, Jan Beulich wrote: >> On 09.11.17 at 15:49, wrote: See the code comment being added for why we need this. Reported-by: Igor Druzhinin Signed-off-by: Jan Beulich >>> >>> I realize we aren't settled yet on where to put the sync call. The >>> discussion appears to have stalled, though. Just to recap, >>> alternatives to the placement below are >>> - at the top of complete_domain_destroy(), being the specific >>> RCU callback exhibiting the problem (others are unlikely to >>> touch guest state) >>> - in rcu_do_batch(), paralleling the similar call from >>> do_tasklet_work() >> >> rcu_do_batch() sounds better to me. As I said before I think that the >> problem is general for the hypervisor (not for VMX only) and might >> appear in other places as well. > > The question here is: In what other cases do we expect an RCU > callback to possibly touch guest state? I think the common use is > to merely free some memory in a delayed fashion. > I don't know for sure what the common scenario is for Xen but drawing parallels between Linux - you're probably right. >> Those choices that you outlined appear to be different in terms whether >> we solve the general problem and probably have some minor performance >> impact or we solve the ad-hoc problem but make the system more >> entangled. Here I'm more inclined to the first choice because this >> particular scenario the performance impact should be negligible. > > For the problem at hand there's no question about a > performance effect. The question is whether doing this for _other_ > RCU callbacks would introduce a performance drop in certain cases. > Yes, right. In that case this placement would mean we are going to lose the partial context each time we take RCU in idle, is this correct? If so that sounds like a common scenario to me and means there will be some performance degradation, although I don't know how common it really is. Anyway, if you're in favor of the previous approach I have no objections as my understanding of Xen codebase is still partial. Igor ___ Xen-devel mailing list Xen-devel@lists.xen.org https://lists.xen.org/xen-devel
Re: [Xen-devel] Ping: [PATCH] VMX: sync CPU state upon vCPU destruction
>>> On 21.11.17 at 15:07,wrote: > On 21/11/17 13:22, Jan Beulich wrote: > On 09.11.17 at 15:49, wrote: >>> See the code comment being added for why we need this. >>> >>> Reported-by: Igor Druzhinin >>> Signed-off-by: Jan Beulich >> >> I realize we aren't settled yet on where to put the sync call. The >> discussion appears to have stalled, though. Just to recap, >> alternatives to the placement below are >> - at the top of complete_domain_destroy(), being the specific >> RCU callback exhibiting the problem (others are unlikely to >> touch guest state) >> - in rcu_do_batch(), paralleling the similar call from >> do_tasklet_work() > > rcu_do_batch() sounds better to me. As I said before I think that the > problem is general for the hypervisor (not for VMX only) and might > appear in other places as well. The question here is: In what other cases do we expect an RCU callback to possibly touch guest state? I think the common use is to merely free some memory in a delayed fashion. > Those choices that you outlined appear to be different in terms whether > we solve the general problem and probably have some minor performance > impact or we solve the ad-hoc problem but make the system more > entangled. Here I'm more inclined to the first choice because this > particular scenario the performance impact should be negligible. For the problem at hand there's no question about a performance effect. The question is whether doing this for _other_ RCU callbacks would introduce a performance drop in certain cases. Jan ___ Xen-devel mailing list Xen-devel@lists.xen.org https://lists.xen.org/xen-devel
Re: [Xen-devel] Ping: [PATCH] VMX: sync CPU state upon vCPU destruction
On 21/11/17 13:22, Jan Beulich wrote: On 09.11.17 at 15:49,wrote: >> See the code comment being added for why we need this. >> >> Reported-by: Igor Druzhinin >> Signed-off-by: Jan Beulich > > I realize we aren't settled yet on where to put the sync call. The > discussion appears to have stalled, though. Just to recap, > alternatives to the placement below are > - at the top of complete_domain_destroy(), being the specific > RCU callback exhibiting the problem (others are unlikely to > touch guest state) > - in rcu_do_batch(), paralleling the similar call from > do_tasklet_work() rcu_do_batch() sounds better to me. As I said before I think that the problem is general for the hypervisor (not for VMX only) and might appear in other places as well. Those choices that you outlined appear to be different in terms whether we solve the general problem and probably have some minor performance impact or we solve the ad-hoc problem but make the system more entangled. Here I'm more inclined to the first choice because this particular scenario the performance impact should be negligible. Igor > > Jan > >> --- a/xen/arch/x86/hvm/vmx/vmx.c >> +++ b/xen/arch/x86/hvm/vmx/vmx.c >> @@ -479,7 +479,13 @@ static void vmx_vcpu_destroy(struct vcpu >> * we should disable PML manually here. Note that vmx_vcpu_destroy is >> called >> * prior to vmx_domain_destroy so we need to disable PML for each vcpu >> * separately here. >> + * >> + * Before doing that though, flush all state for the vCPU previously >> having >> + * run on the current CPU, so that this flushing of state won't happen >> from >> + * the TLB flush IPI handler behind the back of a vmx_vmcs_enter() / >> + * vmx_vmcs_exit() section. >> */ >> +sync_local_execstate(); >> vmx_vcpu_disable_pml(v); >> vmx_destroy_vmcs(v); >> passive_domain_destroy(v); >> >> >> >> >> ___ >> Xen-devel mailing list >> Xen-devel@lists.xen.org >> https://lists.xen.org/xen-devel > > > ___ Xen-devel mailing list Xen-devel@lists.xen.org https://lists.xen.org/xen-devel
[Xen-devel] Ping: [PATCH] VMX: sync CPU state upon vCPU destruction
>>> On 09.11.17 at 15:49,wrote: > See the code comment being added for why we need this. > > Reported-by: Igor Druzhinin > Signed-off-by: Jan Beulich I realize we aren't settled yet on where to put the sync call. The discussion appears to have stalled, though. Just to recap, alternatives to the placement below are - at the top of complete_domain_destroy(), being the specific RCU callback exhibiting the problem (others are unlikely to touch guest state) - in rcu_do_batch(), paralleling the similar call from do_tasklet_work() Jan > --- a/xen/arch/x86/hvm/vmx/vmx.c > +++ b/xen/arch/x86/hvm/vmx/vmx.c > @@ -479,7 +479,13 @@ static void vmx_vcpu_destroy(struct vcpu > * we should disable PML manually here. Note that vmx_vcpu_destroy is > called > * prior to vmx_domain_destroy so we need to disable PML for each vcpu > * separately here. > + * > + * Before doing that though, flush all state for the vCPU previously > having > + * run on the current CPU, so that this flushing of state won't happen > from > + * the TLB flush IPI handler behind the back of a vmx_vmcs_enter() / > + * vmx_vmcs_exit() section. > */ > +sync_local_execstate(); > vmx_vcpu_disable_pml(v); > vmx_destroy_vmcs(v); > passive_domain_destroy(v); > > > > > ___ > Xen-devel mailing list > Xen-devel@lists.xen.org > https://lists.xen.org/xen-devel ___ Xen-devel mailing list Xen-devel@lists.xen.org https://lists.xen.org/xen-devel