VT-d: leave FECTL write to vtd_resume()
authorJan Beulich <jbeulich@suse.com>
Tue, 20 Apr 2021 10:02:11 +0000 (12:02 +0200)
committerJan Beulich <jbeulich@suse.com>
Tue, 20 Apr 2021 10:02:11 +0000 (12:02 +0200)
We shouldn't blindly unmask the interrupt when resuming. vtd_resume()
will restore the intended state.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
master commit: 0d597e7bd1bd8a57619690d457f79769777a5834
master date: 2021-03-30 14:39:23 +0200

xen/drivers/passthrough/vtd/iommu.c

index ca09cd515c2d8981e07c93829d1016b98e1605b8..db1171ce0c0b697edb0e254e8581140c56b55b26 100644 (file)
@@ -2112,7 +2112,7 @@ static int adjust_vtd_irq_affinities(void)
 }
 __initcall(adjust_vtd_irq_affinities);
 
-static int __must_check init_vtd_hw(void)
+static int __must_check init_vtd_hw(bool resume)
 {
     struct acpi_drhd_unit *drhd;
     struct vtd_iommu *iommu;
@@ -2141,6 +2141,10 @@ static int __must_check init_vtd_hw(void)
             disable_qinval(iommu);
         }
 
+        if ( resume )
+            /* FECTL write done by vtd_resume(). */
+            continue;
+
         spin_lock_irqsave(&iommu->register_lock, flags);
         sts = dmar_readl(iommu->reg, DMAR_FECTL_REG);
         sts &= ~DMA_FECTL_IM;
@@ -2340,7 +2344,7 @@ static int __init vtd_setup(void)
     P(iommu_hap_pt_share, "Shared EPT tables");
 #undef P
 
-    ret = init_vtd_hw();
+    ret = init_vtd_hw(false);
     if ( ret )
         goto error;
 
@@ -2611,7 +2615,7 @@ static void vtd_resume(void)
     if ( !iommu_enabled )
         return;
 
-    if ( init_vtd_hw() != 0  && force_iommu )
+    if ( init_vtd_hw(true) != 0 && force_iommu )
          panic("IOMMU setup failed, crash Xen for security purpose\n");
 
     for_each_drhd_unit ( drhd )