[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-ppc] [PULL 3/8] spapr_pci: fix irq leak in RTAS ibm, change-msi
From: |
David Gibson |
Subject: |
[Qemu-ppc] [PULL 3/8] spapr_pci: fix irq leak in RTAS ibm, change-msi |
Date: |
Mon, 29 Feb 2016 17:58:26 +1100 |
From: Greg Kurz <address@hidden>
This RTAS call is used to request new interrupts or to free all interrupts.
If the driver has already allocated interrupts and asks again for a non-null
number of irqs, then the rtas_ibm_change_msi() function will silently leak
the previous interrupts.
It happens because xics_free() is only called when the driver releases all
interrupts (!req_num case). Note that the previously allocated spapr_pci_msi
is not leaked because the GHashTable is created with destroy functions and
g_hash_table_insert() hence frees the old value.
This patch makes sure any previously allocated MSIs are released when a
new allocation succeeds.
Signed-off-by: Greg Kurz <address@hidden>
Signed-off-by: David Gibson <address@hidden>
---
hw/ppc/spapr_pci.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c
index 19dd6db..9b2b546 100644
--- a/hw/ppc/spapr_pci.c
+++ b/hw/ppc/spapr_pci.c
@@ -305,9 +305,10 @@ static void rtas_ibm_change_msi(PowerPCCPU *cpu,
sPAPRMachineState *spapr,
return;
}
+ msi = (spapr_pci_msi *) g_hash_table_lookup(phb->msi, &config_addr);
+
/* Releasing MSIs */
if (!req_num) {
- msi = (spapr_pci_msi *) g_hash_table_lookup(phb->msi, &config_addr);
if (!msi) {
trace_spapr_pci_msi("Releasing wrong config", config_addr);
rtas_st(rets, 0, RTAS_OUT_HW_ERROR);
@@ -360,6 +361,12 @@ static void rtas_ibm_change_msi(PowerPCCPU *cpu,
sPAPRMachineState *spapr,
return;
}
+ /* Release previous MSIs */
+ if (msi) {
+ xics_free(spapr->icp, msi->first_irq, msi->num);
+ g_hash_table_remove(phb->msi, &config_addr);
+ }
+
/* Setup MSI/MSIX vectors in the device (via cfgspace or MSIX BAR) */
spapr_msi_setmsg(pdev, SPAPR_PCI_MSI_WINDOW, ret_intr_type ==
RTAS_TYPE_MSIX,
irq, req_num);
--
2.5.0
- [Qemu-ppc] [PULL 0/8] ppc-for-2.6 queue 20160229, David Gibson, 2016/02/29
- [Qemu-ppc] [PULL 1/8] spapr_rng: disable hotpluggability, David Gibson, 2016/02/29
- [Qemu-ppc] [PULL 4/8] spapr: disable vmdesc submission for old machines, David Gibson, 2016/02/29
- [Qemu-ppc] [PULL 7/8] migration: allow machine to enforce configuration section migration, David Gibson, 2016/02/29
- [Qemu-ppc] [PULL 3/8] spapr_pci: fix irq leak in RTAS ibm, change-msi,
David Gibson <=
- [Qemu-ppc] [PULL 8/8] xics: report errors with the QEMU Error API, David Gibson, 2016/02/29
- [Qemu-ppc] [PULL 2/8] spapr_pci: kill useless variable in rtas_ibm_change_msi(), David Gibson, 2016/02/29
- [Qemu-ppc] [PULL 5/8] dbdma: warn when using unassigned channel, David Gibson, 2016/02/29
- [Qemu-ppc] [PULL 6/8] spapr: skip configuration section during migration of older machines, David Gibson, 2016/02/29
- Re: [Qemu-ppc] [PULL 0/8] ppc-for-2.6 queue 20160229, Peter Maydell, 2016/02/29