[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 3/3] VMX: Remove the vcpu from the per-cpu blocking list after domain termination
We need to make sure the bocking vcpu is not in any per-cpu blocking list when the associated domain is going to be destroyed. Signed-off-by: Feng Wu <feng.wu@xxxxxxxxx> --- xen/arch/x86/hvm/vmx/vmx.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index 4862b13..e74b3e7 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -248,6 +248,36 @@ void vmx_pi_hooks_deassign(struct domain *d) d->arch.hvm_domain.vmx.pi_switch_to = NULL; } +static void vmx_pi_blocking_list_cleanup(struct domain *d) +{ + unsigned int cpu; + + for_each_online_cpu ( cpu ) + { + struct vcpu *v; + unsigned long flags; + struct arch_vmx_struct *vmx, *tmp; + spinlock_t *lock = &per_cpu(vmx_pi_blocking, cpu).lock; + struct list_head *blocked_vcpus = &per_cpu(vmx_pi_blocking, cpu).list; + + spin_lock_irqsave(lock, flags); + + list_for_each_entry_safe(vmx, tmp, blocked_vcpus, pi_blocking.list) + { + v = container_of(vmx, struct vcpu, arch.hvm_vmx); + + if (v->domain == d) + { + list_del(&vmx->pi_blocking.list); + ASSERT(vmx->pi_blocking.lock == lock); + vmx->pi_blocking.lock = NULL; + } + } + + spin_unlock_irqrestore(lock, flags); + } +} + static int vmx_domain_initialise(struct domain *d) { int rc; @@ -265,6 +295,8 @@ static int vmx_domain_initialise(struct domain *d) static void vmx_domain_destroy(struct domain *d) { + vmx_pi_blocking_list_cleanup(d); + if ( !has_vlapic(d) ) return; -- 2.1.0 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |