summaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorKeith Busch <keith.busch@intel.com>2016-08-05 00:09:09 +0200
committerBjorn Helgaas <bhelgaas@google.com>2016-09-19 20:14:05 +0200
commitee6ee49fd09fa17c92aadf07961d0ff406fceab8 (patch)
treeb159d9b1004faceb210b73be19dd66125e964d43 /arch
parentx86/PCI: VMD: Eliminate index member from IRQ list (diff)
downloadlinux-ee6ee49fd09fa17c92aadf07961d0ff406fceab8.tar.xz
linux-ee6ee49fd09fa17c92aadf07961d0ff406fceab8.zip
x86/PCI: VMD: Synchronize with RCU freeing MSI IRQ descs
Fix a potential race when disabling MSI/MSI-X on a VMD domain device. If the VMD interrupt service is running, it may see a disabled IRQ. We can synchronize RCU just before freeing the MSI descriptor. This is safe since the irq_desc lock isn't held, and the descriptor is valid even though it is disabled. After vmd_msi_free(), though, the handler is reinitialized to handle_bad_irq(), so we can't let the VMD ISR's list iteration see the disabled IRQ after this. Signed-off-by: Keith Busch <keith.busch@intel.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Acked-by Jon Derrick: <jonathan.derrick@intel.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/pci/vmd.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/arch/x86/pci/vmd.c b/arch/x86/pci/vmd.c
index e785907acb79..57058520f219 100644
--- a/arch/x86/pci/vmd.c
+++ b/arch/x86/pci/vmd.c
@@ -218,6 +218,8 @@ static void vmd_msi_free(struct irq_domain *domain,
struct vmd_irq *vmdirq = irq_get_chip_data(virq);
unsigned long flags;
+ synchronize_rcu();
+
/* XXX: Potential optimization to rebalance */
raw_spin_lock_irqsave(&list_lock, flags);
vmdirq->irq->count--;