x86, irq: Keep balance of IOAPIC pin reference count
[cascardo/linux.git] / arch / x86 / pci / irq.c
index cb50e28..9988458 100644 (file)
@@ -1202,6 +1202,9 @@ static int pirq_enable_irq(struct pci_dev *dev)
                        int irq;
                        struct io_apic_irq_attr irq_attr;
 
+                       if (dev->irq_managed && dev->irq > 0)
+                               return 0;
+
                        irq = IO_APIC_get_PCI_irq_vector(dev->bus->number,
                                                PCI_SLOT(dev->devfn),
                                                pin - 1, &irq_attr);
@@ -1228,6 +1231,7 @@ static int pirq_enable_irq(struct pci_dev *dev)
                        }
                        dev = temp_dev;
                        if (irq >= 0) {
+                               dev->irq_managed = 1;
                                dev->irq = irq;
                                dev_info(&dev->dev, "PCI->APIC IRQ transform: "
                                         "INT %c -> IRQ %d\n", 'A' + pin - 1, irq);
@@ -1269,8 +1273,9 @@ bool mp_should_keep_irq(struct device *dev)
 static void pirq_disable_irq(struct pci_dev *dev)
 {
        if (io_apic_assign_pci_irqs && !mp_should_keep_irq(&dev->dev) &&
-           dev->irq) {
+           dev->irq_managed && dev->irq) {
                mp_unmap_irq(dev->irq);
                dev->irq = 0;
+               dev->irq_managed = 0;
        }
 }