vt-d: Fix double spin_lock_irqsave().
authorKeir Fraser <keir.fraser@citrix.com>
Thu, 10 Jul 2008 09:07:32 +0000 (10:07 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Thu, 10 Jul 2008 09:07:32 +0000 (10:07 +0100)
The duplicate spin_lock_irqsave() flushes the original EFLAGS saved,
and thus disables local irqs permanently.

Signed-off-by: Xin, Xiaohui <Xiaohui.xin@intel.com>
Signed-off-by: Tian, Kevin <Kevin.Tian@intel.com>
xen/arch/x86/hvm/vmx/vmx.c
xen/drivers/passthrough/vtd/qinval.c

index 8bf842d29cbf3087b571d0540cf87c38768ad932..8114a93ad2bd6a10a43fa5ef3174201550d07ca0 100644 (file)
@@ -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(
index 555beb32a9141761e3956360c52df5eab99e1bd7..a3973e3f6d125a57634e4734997ed0f0a7a9df23 100644 (file)
@@ -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 )