]> xenbits.xensource.com Git - xen.git/commitdiff
x86: s3: write_msi_msg: entry->msg should be in the compatibility format
authorKeir Fraser <keir.fraser@citrix.com>
Thu, 25 Mar 2010 09:19:33 +0000 (09:19 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Thu, 25 Mar 2010 09:19:33 +0000 (09:19 +0000)
When Interrupt Remapping is used, after Dom0 S3, Dom0's filesystem
might become inaccessible as the SATA disk's MSI interrupt becomes
buggy.  The cause is: After set_msi_affinity() or setup_msi_irq()
invokes write_msi_msg(), entry->msg records the remappable format
message; during S3 resume, Dom0 invokes the PHYSDEVOP_restore_msi
hypercall to restore the MSI registers of devices, and in
pci_restore_msi_state() -> write_msi_msg(), the 'entry->msg' of
remappable format is passed, but in write_msi_msg() -> ... ->
msi_msg_to_remap_entry(), the 'msg' is assumed to be in compatibility
format.  As a result, after s3, the IRTE is corrupted.

Actually the only users of 'entry->msg' are pci_restore_msi_state()
and dump_msi(). That's why we don't have issue except Dom0 S3.

Signed-off-by: Dexuan Cui <dexuan.cui@intel.com>
xen/arch/x86/msi.c

index 06b53a202f8069c40db52a2e1ca6020ef86268ae..5b8037a6f9cc741d446ab869bb3063b17c072489 100644 (file)
@@ -218,6 +218,8 @@ static int set_irq_msi(struct msi_desc *entry)
 
 static void write_msi_msg(struct msi_desc *entry, struct msi_msg *msg)
 {
+    entry->msg = *msg;
+
     if ( iommu_enabled )
         iommu_update_ire_from_msi(entry, msg);
 
@@ -260,7 +262,6 @@ static void write_msi_msg(struct msi_desc *entry, struct msi_msg *msg)
     default:
         BUG();
     }
-    entry->msg = *msg;
 }
 
 void set_msi_affinity(unsigned int irq, cpumask_t mask)