From: Keir Fraser Date: Thu, 10 Jul 2008 09:07:32 +0000 (+0100) Subject: vt-d: Fix double spin_lock_irqsave(). X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~14188^2~61 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=658233700ee73b7f4648296b27928f0ffa98f854;p=xen.git vt-d: Fix double spin_lock_irqsave(). The duplicate spin_lock_irqsave() flushes the original EFLAGS saved, and thus disables local irqs permanently. Signed-off-by: Xin, Xiaohui Signed-off-by: Tian, Kevin --- diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index 8bf842d29c..8114a93ad2 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -1086,7 +1086,10 @@ void ept_sync_domain(struct domain *d) { /* Only if using EPT and this domain has some VCPUs to dirty. */ if ( d->arch.hvm_domain.hap_enabled && d->vcpu[0] ) + { + ASSERT(local_irq_is_enabled()); on_each_cpu(__ept_sync_domain, d, 1, 1); + } } static void __vmx_inject_exception( diff --git a/xen/drivers/passthrough/vtd/qinval.c b/xen/drivers/passthrough/vtd/qinval.c index 555beb32a9..a3973e3f6d 100644 --- a/xen/drivers/passthrough/vtd/qinval.c +++ b/xen/drivers/passthrough/vtd/qinval.c @@ -190,13 +190,13 @@ static int queue_invalidate_wait(struct iommu *iommu, struct qi_ctrl *qi_ctrl = iommu_qi_ctrl(iommu); spin_lock_irqsave(&qi_ctrl->qinval_poll_lock, flags); - spin_lock_irqsave(&iommu->register_lock, flags); + spin_lock(&iommu->register_lock); index = qinval_next_index(iommu); if ( *saddr == 1 ) *saddr = 0; ret = gen_wait_dsc(iommu, index, iflag, sw, fn, sdata, saddr); ret |= qinval_update_qtail(iommu, index); - spin_unlock_irqrestore(&iommu->register_lock, flags); + spin_unlock(&iommu->register_lock); /* Now we don't support interrupt method */ if ( sw )