This patch fixes 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 reinitialiazed 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@xxxxxxxxx> --- arch/x86/pci/vmd.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/x86/pci/vmd.c b/arch/x86/pci/vmd.c index 2294907..e3c9b9e 100644 --- a/arch/x86/pci/vmd.c +++ b/arch/x86/pci/vmd.c @@ -213,6 +213,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--; -- 2.7.2 -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html