104 lines
3.7 KiB
Diff
104 lines
3.7 KiB
Diff
|
From b27062f4b3ddf47dea926026e5511f15d5b31320 Mon Sep 17 00:00:00 2001
|
||
|
From: David Gibson <dgibson@redhat.com>
|
||
|
Date: Tue, 10 Sep 2019 07:04:27 +0100
|
||
|
Subject: [PATCH 5/6] spapr/pci: Consolidate de-allocation of MSIs
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: text/plain; charset=UTF-8
|
||
|
Content-Transfer-Encoding: 8bit
|
||
|
|
||
|
RH-Author: David Gibson <dgibson@redhat.com>
|
||
|
Message-id: <20190910070428.28628-2-dgibson@redhat.com>
|
||
|
Patchwork-id: 90362
|
||
|
O-Subject: [RHEL-AV-8.1 qemu-kvm PATCH 1/2] spapr/pci: Consolidate de-allocation of MSIs
|
||
|
Bugzilla: 1750200
|
||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||
|
RH-Acked-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||
|
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
|
||
|
|
||
|
From: Greg Kurz <groug@kaod.org>
|
||
|
|
||
|
When freeing MSIs, we need to:
|
||
|
- remove them from the machine's MSI bitmap
|
||
|
- remove them from the IC backend
|
||
|
- remove them from the PHB's MSI cache
|
||
|
|
||
|
This is currently open coded in two places in rtas_ibm_change_msi(),
|
||
|
and we're about to need this in spapr_phb_reset() as well. Instead of
|
||
|
duplicating this code again, make it a destroy function for the PHB's
|
||
|
MSI cache. Removing an MSI device from the cache will call the destroy
|
||
|
function internally.
|
||
|
|
||
|
Signed-off-by: Greg Kurz <groug@kaod.org>
|
||
|
Message-Id: <156415227855.1064338.5657793835271464648.stgit@bahia.lan>
|
||
|
Reviewed-by: Cédric Le Goater <clg@kaod.org>
|
||
|
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
|
||
|
(cherry picked from commit 078eb6b05b7f962e43d8bc376e0b96cdd550c17a)
|
||
|
|
||
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1750200
|
||
|
|
||
|
Signed-off-by: David Gibson <dgibson@redhat.com>
|
||
|
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||
|
---
|
||
|
hw/ppc/spapr_pci.c | 24 +++++++++++++++---------
|
||
|
1 file changed, 15 insertions(+), 9 deletions(-)
|
||
|
|
||
|
diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c
|
||
|
index 9003fe9..1ffcfae 100644
|
||
|
--- a/hw/ppc/spapr_pci.c
|
||
|
+++ b/hw/ppc/spapr_pci.c
|
||
|
@@ -336,10 +336,6 @@ static void rtas_ibm_change_msi(PowerPCCPU *cpu, SpaprMachineState *spapr,
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
- if (!smc->legacy_irq_allocation) {
|
||
|
- spapr_irq_msi_free(spapr, msi->first_irq, msi->num);
|
||
|
- }
|
||
|
- spapr_irq_free(spapr, msi->first_irq, msi->num);
|
||
|
if (msi_present(pdev)) {
|
||
|
spapr_msi_setmsg(pdev, 0, false, 0, 0);
|
||
|
}
|
||
|
@@ -409,10 +405,6 @@ static void rtas_ibm_change_msi(PowerPCCPU *cpu, SpaprMachineState *spapr,
|
||
|
|
||
|
/* Release previous MSIs */
|
||
|
if (msi) {
|
||
|
- if (!smc->legacy_irq_allocation) {
|
||
|
- spapr_irq_msi_free(spapr, msi->first_irq, msi->num);
|
||
|
- }
|
||
|
- spapr_irq_free(spapr, msi->first_irq, msi->num);
|
||
|
g_hash_table_remove(phb->msi, &config_addr);
|
||
|
}
|
||
|
|
||
|
@@ -1806,6 +1798,19 @@ static void spapr_phb_unrealize(DeviceState *dev, Error **errp)
|
||
|
memory_region_del_subregion(get_system_memory(), &sphb->mem32window);
|
||
|
}
|
||
|
|
||
|
+static void spapr_phb_destroy_msi(gpointer opaque)
|
||
|
+{
|
||
|
+ SpaprMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
|
||
|
+ SpaprMachineClass *smc = SPAPR_MACHINE_GET_CLASS(spapr);
|
||
|
+ spapr_pci_msi *msi = opaque;
|
||
|
+
|
||
|
+ if (!smc->legacy_irq_allocation) {
|
||
|
+ spapr_irq_msi_free(spapr, msi->first_irq, msi->num);
|
||
|
+ }
|
||
|
+ spapr_irq_free(spapr, msi->first_irq, msi->num);
|
||
|
+ g_free(msi);
|
||
|
+}
|
||
|
+
|
||
|
static void spapr_phb_realize(DeviceState *dev, Error **errp)
|
||
|
{
|
||
|
/* We don't use SPAPR_MACHINE() in order to exit gracefully if the user
|
||
|
@@ -2017,7 +2022,8 @@ static void spapr_phb_realize(DeviceState *dev, Error **errp)
|
||
|
spapr_tce_get_iommu(tcet));
|
||
|
}
|
||
|
|
||
|
- sphb->msi = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, g_free);
|
||
|
+ sphb->msi = g_hash_table_new_full(g_int_hash, g_int_equal, g_free,
|
||
|
+ spapr_phb_destroy_msi);
|
||
|
return;
|
||
|
|
||
|
unrealize:
|
||
|
--
|
||
|
1.8.3.1
|
||
|
|