aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>2011-02-17 16:12:51 -0500
committerKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>2011-02-18 12:41:53 -0500
commit3d74a539ae07a8f3c061332e426fc07b2310cf05 (patch)
treed2e7fc97c31a8fe1ed74e5623f0ae2dffc38e366
parentcc0f89c4a426fcd6400a89e9e34e4a8851abef76 (diff)
pci/xen: When free-ing MSI-X/MSI irq->desc also use generic code.
This code path is only run when an MSI/MSI-X PCI device is passed in to PV DomU. In 2.6.37 time-frame we over-wrote the default cleanup handler for MSI/MSI-X irq->desc to be "xen_teardown_msi_irqs". That function calls the the xen-pcifront driver which can tell the backend to cleanup/take back the MSI/MSI-X device. However, we forgot to continue the process of free-ing the MSI/MSI-X device resources (irq->desc) in the PV domU side. Which is what the default cleanup handler: default_teardown_msi_irqs did. Hence we would leak IRQ descriptors. Without this patch, doing "rmmod igbvf;modprobe igbvf" multiple times ends with abandoned IRQ descriptors: 28: 5 xen-pirq-pcifront-msi-x 29: 8 xen-pirq-pcifront-msi-x ... 130: 10 xen-pirq-pcifront-msi-x with the end result of running out of IRQ descriptors. Reviewed-by: Ian Campbell <Ian.Campbell@citrix.com> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
-rw-r--r--arch/x86/pci/xen.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/arch/x86/pci/xen.c b/arch/x86/pci/xen.c
index 30fdd09dea05..57afd1da491d 100644
--- a/arch/x86/pci/xen.c
+++ b/arch/x86/pci/xen.c
@@ -193,6 +193,9 @@ static void xen_teardown_msi_irqs(struct pci_dev *dev)
193 xen_pci_frontend_disable_msix(dev); 193 xen_pci_frontend_disable_msix(dev);
194 else 194 else
195 xen_pci_frontend_disable_msi(dev); 195 xen_pci_frontend_disable_msi(dev);
196
197 /* Free the IRQ's and the msidesc using the generic code. */
198 default_teardown_msi_irqs(dev);
196} 199}
197 200
198static void xen_teardown_msi_irq(unsigned int irq) 201static void xen_teardown_msi_irq(unsigned int irq)