Message ID | 20190812171729.4984-1-andrew.cooper3@citrix.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | x86/vtd: Fix S3 resume following c/s 650c31d3af | expand |
> From: Andrew Cooper [mailto:andrew.cooper3@citrix.com] > Sent: Tuesday, August 13, 2019 1:17 AM > > c/s 650c31d3af "x86/IRQ: fix locking around vector management" adjusted > the > locking in adjust_irq_affinity(). > > The S3 path ends up here via iommu_resume() before interrupts are enabled, > at > which point spin_lock_irq() which fail ASSERT(local_irq_is_enabled()); but > with no working console. > > Use spin_lock_irqsave() instead to cope with interrupts already being > disabled. > > Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> Reviewed-by: Kevin Tian <kevin.tian@intel.com>
diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c index 5d72270c5b..defa74fae3 100644 --- a/xen/drivers/passthrough/vtd/iommu.c +++ b/xen/drivers/passthrough/vtd/iommu.c @@ -2135,15 +2135,16 @@ static void adjust_irq_affinity(struct acpi_drhd_unit *drhd) : NUMA_NO_NODE; const cpumask_t *cpumask = NULL; struct irq_desc *desc; + unsigned long flags; if ( node < MAX_NUMNODES && node_online(node) && cpumask_intersects(&node_to_cpumask(node), &cpu_online_map) ) cpumask = &node_to_cpumask(node); desc = irq_to_desc(drhd->iommu->msi.irq); - spin_lock_irq(&desc->lock); + spin_lock_irqsave(&desc->lock, flags); dma_msi_set_affinity(desc, cpumask); - spin_unlock_irq(&desc->lock); + spin_unlock_irqrestore(&desc->lock, flags); } static int adjust_vtd_irq_affinities(void)
c/s 650c31d3af "x86/IRQ: fix locking around vector management" adjusted the locking in adjust_irq_affinity(). The S3 path ends up here via iommu_resume() before interrupts are enabled, at which point spin_lock_irq() which fail ASSERT(local_irq_is_enabled()); but with no working console. Use spin_lock_irqsave() instead to cope with interrupts already being disabled. Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> --- CC: Jan Beulich <JBeulich@suse.com> CC: Wei Liu <wl@xen.org> CC: Roger Pau Monné <roger.pau@citrix.com> CC: Jun Nakajima <jun.nakajima@intel.com> CC: Kevin Tian <kevin.tian@intel.com> I'm fairly confident that the AMD side of things is fine, because enable_iommu() is encompased by a spin_lock_irqsave() block. --- xen/drivers/passthrough/vtd/iommu.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)