diff options
author | Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 2011-02-17 16:12:51 -0500 |
---|---|---|
committer | Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 2011-02-18 12:41:53 -0500 |
commit | 3d74a539ae07a8f3c061332e426fc07b2310cf05 (patch) | |
tree | d2e7fc97c31a8fe1ed74e5623f0ae2dffc38e366 /arch/x86/pci | |
parent | cc0f89c4a426fcd6400a89e9e34e4a8851abef76 (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>
Diffstat (limited to 'arch/x86/pci')
-rw-r--r-- | arch/x86/pci/xen.c | 3 |
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 | ||
198 | static void xen_teardown_msi_irq(unsigned int irq) | 201 | static void xen_teardown_msi_irq(unsigned int irq) |