[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 3/6] VMX: Cleanup PI per-cpu blocking list when vcpu is destroyed
On Wed, 2016-08-31 at 11:56 +0800, Feng Wu wrote: > We should remove the vCPU from the per-cpu blocking list > if it is going to be destroyed. > > Signed-off-by: Feng Wu <feng.wu@xxxxxxxxx> > --- > xen/arch/x86/hvm/vmx/vmx.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c > index b869728..37fa2f1 100644 > --- a/xen/arch/x86/hvm/vmx/vmx.c > +++ b/xen/arch/x86/hvm/vmx/vmx.c > @@ -346,6 +346,7 @@ static void vmx_vcpu_destroy(struct vcpu *v) > vmx_destroy_vmcs(v); > vpmu_destroy(v); > passive_domain_destroy(v); > + vmx_pi_blocking_cleanup(v); > I'm not too much into VMX, so I may be wrong (in which case, sorry), but is it safe to call this after vmx_destroy_vmcs() ? Also (even if it is), we're basically calling and executing the following (called by vmx_pi_blocking_clanup()): static void vmx_pi_remove_vcpu_from_blocking_list(struct vcpu *v) { unsigned long flags; spinlock_t *pi_blocking_list_lock; struct pi_desc *pi_desc = &v->arch.hvm_vmx.pi_desc; /* * Set 'NV' field back to posted_intr_vector, so the * Posted-Interrupts can be delivered to the vCPU when * it is running in non-root mode. */ write_atomic(&pi_desc->nv, posted_intr_vector); /* The vCPU is not on any blocking list. */ pi_blocking_list_lock = v->arch.hvm_vmx.pi_blocking.lock; /* Prevent the compiler from eliminating the local variable.*/ smp_rmb(); if ( pi_blocking_list_lock == NULL ) return; spin_lock_irqsave(pi_blocking_list_lock, flags); /* * v->arch.hvm_vmx.pi_blocking.lock == NULL here means the vCPU * was removed from the blocking list while we are acquiring the lock. */ if ( v->arch.hvm_vmx.pi_blocking.lock != NULL ) { ASSERT(v->arch.hvm_vmx.pi_blocking.lock == pi_blocking_list_lock); list_del(&v->arch.hvm_vmx.pi_blocking.list); v->arch.hvm_vmx.pi_blocking.lock = NULL; } spin_unlock_irqrestore(pi_blocking_list_lock, flags); } Considering that we're destroying, isn't this too much? Maybe it's not a big deal, but I'd have expected that all is needed here is something like: if ( v->arch.hvm_vmx.pi_blocking.lock ) { spin_lock_irqsave(..); list_del(..); spin_unlock_irqrestore(..); } Maybe the resume, list_remove, and cleanup functions need to be broken up a bit more/better? Also, as a side note (which I think would be more appropriate as a comment to patch 1, but bear with me, I'm just back from vacations, I have a lot of catch up to do, and I'm in hurry! :-P), now that the function is called vmx_pi_remove_vcpu_from_blocking_list(), this comment being part of its body sounds a bit weird: ... /* The vCPU is not on any blocking list. */ pi_blocking_list_loc k = v->arch.hvm_vmx.pi_blocking.lock; ... I'd take the chance for rephrasing it. Regards, Dario -- <<This happens because I choose it to happen!>> (Raistlin Majere) ----------------------------------------------------------------- Dario Faggioli, Ph.D, http://about.me/dario.faggioli Senior Software Engineer, Citrix Systems R&D Ltd., Cambridge (UK) Attachment:
signature.asc _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |