We don't set the affinity for posted format IRTE, since the destination of these interrupts is vCPU and the vCPU affinity is set during vCPU scheduling.
Signed-off-by: Feng Wu <feng...@intel.com> --- v6: - Make pi_can_suppress_irte_update() a check-only function - Introduce another function pi_get_new_irte() to update the 'new_ire' if needed v5: - Only suppress affinity related IRTE updates for PI v4: - Keep the construction of new_ire and only modify the hardware IRTE when it is not in posted mode. xen/drivers/passthrough/vtd/intremap.c | 61 ++++++++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 3 deletions(-) diff --git a/xen/drivers/passthrough/vtd/intremap.c b/xen/drivers/passthrough/vtd/intremap.c index bfd468b..97e80a6 100644 --- a/xen/drivers/passthrough/vtd/intremap.c +++ b/xen/drivers/passthrough/vtd/intremap.c @@ -547,6 +547,54 @@ static int remap_entry_to_msi_msg( return 0; } +static bool pi_can_suppress_irte_update(const struct iremap_entry *new, + const struct iremap_entry *old) +{ + ASSERT( old && new ); + + if ( !old->remap.p || !old->remap.im || !new->remap.p || new->remap.im ) + return false; + + /* + * We are updating posted IRTE to remapped one, check whether + * the common fields are going to be changed. + */ + if ( ( new->remap.fpd != old->post.fpd ) || + ( new->remap.sid != old->post.sid ) || + ( new->remap.sq != old->post.sq ) || + ( new->remap.svt != old->post.svt ) ) + return false; + + return true; +} + +static void pi_get_new_irte(struct iremap_entry *new, + const struct iremap_entry *old) +{ + u16 fpd, sid, sq, svt; + + ASSERT( old && new ); + + fpd = new->remap.fpd; + sid = new->remap.sid; + sq = new->remap.sq; + svt = new->remap.svt; + + *new = *old; + + if ( fpd != old->post.fpd ) + new->post.fpd = fpd; + + if ( sid != old->post.sid ) + new->post.sid = sid; + + if ( sq != old->post.sq ) + new->post.sq = sq; + + if ( svt != old->post.svt ) + new->post.svt = svt; +} + static int msi_msg_to_remap_entry( struct iommu *iommu, struct pci_dev *pdev, struct msi_desc *msi_desc, struct msi_msg *msg) @@ -637,9 +685,16 @@ static int msi_msg_to_remap_entry( remap_rte->address_hi = 0; remap_rte->data = index - i; - memcpy(iremap_entry, &new_ire, sizeof(struct iremap_entry)); - iommu_flush_cache_entry(iremap_entry, sizeof(struct iremap_entry)); - iommu_flush_iec_index(iommu, 0, index); + if ( !pi_can_suppress_irte_update(&new_ire, iremap_entry) ) + { + if ( iremap_entry->remap.p && iremap_entry->remap.im && + new_ire.remap.p && !new_ire.remap.im ) + pi_get_new_irte(&new_ire, iremap_entry); + + memcpy(iremap_entry, &new_ire, sizeof(struct iremap_entry)); + iommu_flush_cache_entry(iremap_entry, sizeof(struct iremap_entry)); + iommu_flush_iec_index(iommu, 0, index); + } unmap_vtd_domain_page(iremap_entries); spin_unlock_irqrestore(&ir_ctrl->iremap_lock, flags); -- 2.1.0 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org https://lists.xen.org/xen-devel