mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
x86/vmx: fix posted interrupts usage of msi_desc->msg field
The current usage of msi_desc->msg in vmx_pi_update_irte() will make the field contain a translated MSI message, instead of the expected untranslated one. This breaks dump_msi(), that use the data in msi_desc->msg to print the interrupt details. Fix this by introducing a dummy local msi_msg, and use it with iommu_update_ire_from_msi(). vmx_pi_update_irte() relies on the MSI message not changing, so there's no need to propagate the resulting msi_msg to the hardware, and the contents can be ignored. Additionally add a comment to clarify that msi_desc->msg must always contain the untranslated MSI message. Fixes:a5e25908d1('VT-d: introduce new fields in msi_desc to track binding with guest interrupt') Signed-off-by: Roger Pau Monné <roger.pau@citrix.com> Reviewed-by: Jan Beulich <jbeulich@suse.com> master commit:30f0e55a79master date: 2025-03-12 13:32:30 +0100
This commit is contained in:
1 parent
e6219bc97e
commit
0103cb6c1f
2 files changed
+4
-2
No files matched your search
@@ -397,6 +397,7 @@ static int cf_check vmx_pi_update_irte(const struct vcpu *v,
|
||||
const struct pi_desc *pi_desc = v ? &v->arch.hvm.vmx.pi_desc : NULL;
|
||||
struct irq_desc *desc;
|
||||
struct msi_desc *msi_desc;
|
||||
struct msi_msg msg;
|
||||
int rc;
|
||||
|
||||
desc = pirq_spin_lock_irq_desc(pirq, NULL);
|
||||
@@ -411,12 +412,13 @@ static int cf_check vmx_pi_update_irte(const struct vcpu *v,
|
||||
}
|
||||
msi_desc->pi_desc = pi_desc;
|
||||
msi_desc->gvec = gvec;
|
||||
msg = msi_desc->msg;
|
||||
|
||||
spin_unlock_irq(&desc->lock);
|
||||
|
||||
ASSERT(pcidevs_locked());
|
||||
|
||||
return iommu_update_ire_from_msi(msi_desc, &msi_desc->msg);
|
||||
return iommu_update_ire_from_msi(msi_desc, &msg);
|
||||
|
||||
unlock_out:
|
||||
spin_unlock_irq(&desc->lock);
|
||||
|
||||
@@ -123,7 +123,7 @@ struct msi_desc {
|
||||
int irq;
|
||||
int remap_index; /* index in interrupt remapping table */
|
||||
|
||||
struct msi_msg msg; /* Last set MSI message */
|
||||
struct msi_msg msg; /* Last set MSI message (untranslated) */
|
||||
};
|
||||
|
||||
/*
|
||||
|
||||