|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen stable-4.6] VT-d: correct dma_msi_set_affinity()
commit 70ee58248e68477ad21b3d209cc713433b648751
Author: Jan Beulich <jbeulich@xxxxxxxx>
AuthorDate: Wed Jan 18 10:24:22 2017 +0100
Commit: Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Wed Jan 18 10:24:22 2017 +0100
VT-d: correct dma_msi_set_affinity()
Commit 83cd2038fe ("VT-d: use msi_compose_msg()) together with
15aa6c6748 ("amd iommu: use base platform MSI implementation"),
introducing the use of a per-CPU scratch CPU mask, went too far:
dma_msi_set_affinity() may, at least in theory, be called in
interrupt context, and hence the use of that scratch variable is not
correct.
Since the function overwrites the destination information anyway,
allow msi_compose_msg() to be called with a NULL CPU mask, avoiding
the use of that scratch variable.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Reviewed-by: Kevin Tian <kevin.tian@xxxxxxxxx>
Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
master commit: 7f885a1f49a75c770360b030666a5c1545156e5c
master date: 2016-12-16 14:33:43 +0100
---
xen/arch/x86/msi.c | 51 +++++++++++++++++--------------------
xen/drivers/passthrough/vtd/iommu.c | 6 ++---
2 files changed, 26 insertions(+), 31 deletions(-)
diff --git a/xen/arch/x86/msi.c b/xen/arch/x86/msi.c
index c47f92a..dd567b0 100644
--- a/xen/arch/x86/msi.c
+++ b/xen/arch/x86/msi.c
@@ -160,42 +160,37 @@ static bool_t msix_memory_decoded(const struct pci_dev
*dev, unsigned int pos)
*/
void msi_compose_msg(unsigned vector, const cpumask_t *cpu_mask, struct
msi_msg *msg)
{
- unsigned dest;
-
memset(msg, 0, sizeof(*msg));
- if ( !cpumask_intersects(cpu_mask, &cpu_online_map) )
- {
- dprintk(XENLOG_ERR,"%s, compose msi message error!!\n", __func__);
+
+ if ( vector < FIRST_DYNAMIC_VECTOR )
return;
- }
- if ( vector )
+ if ( cpu_mask )
{
cpumask_t *mask = this_cpu(scratch_mask);
+ if ( !cpumask_intersects(cpu_mask, &cpu_online_map) )
+ return;
+
cpumask_and(mask, cpu_mask, &cpu_online_map);
- dest = cpu_mask_to_apicid(mask);
-
- msg->address_hi = MSI_ADDR_BASE_HI;
- msg->address_lo =
- MSI_ADDR_BASE_LO |
- ((INT_DEST_MODE == 0) ?
- MSI_ADDR_DESTMODE_PHYS:
- MSI_ADDR_DESTMODE_LOGIC) |
- ((INT_DELIVERY_MODE != dest_LowestPrio) ?
- MSI_ADDR_REDIRECTION_CPU:
- MSI_ADDR_REDIRECTION_LOWPRI) |
- MSI_ADDR_DEST_ID(dest);
- msg->dest32 = dest;
-
- msg->data =
- MSI_DATA_TRIGGER_EDGE |
- MSI_DATA_LEVEL_ASSERT |
- ((INT_DELIVERY_MODE != dest_LowestPrio) ?
- MSI_DATA_DELIVERY_FIXED:
- MSI_DATA_DELIVERY_LOWPRI) |
- MSI_DATA_VECTOR(vector);
+ msg->dest32 = cpu_mask_to_apicid(mask);
}
+
+ msg->address_hi = MSI_ADDR_BASE_HI;
+ msg->address_lo = MSI_ADDR_BASE_LO |
+ (INT_DEST_MODE ? MSI_ADDR_DESTMODE_LOGIC
+ : MSI_ADDR_DESTMODE_PHYS) |
+ ((INT_DELIVERY_MODE != dest_LowestPrio)
+ ? MSI_ADDR_REDIRECTION_CPU
+ : MSI_ADDR_REDIRECTION_LOWPRI) |
+ MSI_ADDR_DEST_ID(msg->dest32);
+
+ msg->data = MSI_DATA_TRIGGER_EDGE |
+ MSI_DATA_LEVEL_ASSERT |
+ ((INT_DELIVERY_MODE != dest_LowestPrio)
+ ? MSI_DATA_DELIVERY_FIXED
+ : MSI_DATA_DELIVERY_LOWPRI) |
+ MSI_DATA_VECTOR(vector);
}
static bool_t read_msi_msg(struct msi_desc *entry, struct msi_msg *msg)
diff --git a/xen/drivers/passthrough/vtd/iommu.c
b/xen/drivers/passthrough/vtd/iommu.c
index 275d4f1..559e340 100644
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -1046,11 +1046,11 @@ static void dma_msi_set_affinity(struct irq_desc *desc,
const cpumask_t *mask)
return;
}
- msi_compose_msg(desc->arch.vector, desc->arch.cpu_mask, &msg);
- /* Are these overrides really needed? */
+ msi_compose_msg(desc->arch.vector, NULL, &msg);
+ msg.dest32 = dest;
if (x2apic_enabled)
msg.address_hi = dest & 0xFFFFFF00;
- msg.address_lo &= ~MSI_ADDR_DEST_ID_MASK;
+ ASSERT(!(msg.address_lo & MSI_ADDR_DEST_ID_MASK));
msg.address_lo |= MSI_ADDR_DEST_ID(dest);
iommu->msi.msg = msg;
--
generated by git-patchbot for /home/xen/git/xen.git#stable-4.6
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
https://lists.xenproject.org/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |