[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2 1/5] spapr: Fix leak of CPU machine specific data
From: |
Greg Kurz |
Subject: |
[PATCH v2 1/5] spapr: Fix leak of CPU machine specific data |
Date: |
Thu, 15 Oct 2020 23:18:25 +0200 |
User-agent: |
StGit/0.21 |
When a CPU core is being removed, the machine specific data of each
CPU thread object is leaked.
Fix this by calling the dedicated helper we have for that instead of
simply unparenting the CPU object. Call it from a separate loop in
spapr_cpu_core_unrealize() for symmetry with spapr_cpu_core_realize().
Signed-off-by: Greg Kurz <groug@kaod.org>
---
hw/ppc/spapr_cpu_core.c | 22 ++++++++++++----------
1 file changed, 12 insertions(+), 10 deletions(-)
diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
index b03620823adb..c55211214524 100644
--- a/hw/ppc/spapr_cpu_core.c
+++ b/hw/ppc/spapr_cpu_core.c
@@ -188,7 +188,6 @@ static void spapr_unrealize_vcpu(PowerPCCPU *cpu,
SpaprCpuCore *sc)
}
spapr_irq_cpu_intc_destroy(SPAPR_MACHINE(qdev_get_machine()), cpu);
cpu_remove_sync(CPU(cpu));
- object_unparent(OBJECT(cpu));
}
/*
@@ -213,6 +212,15 @@ static void spapr_cpu_core_reset_handler(void *opaque)
spapr_cpu_core_reset(opaque);
}
+static void spapr_delete_vcpu(PowerPCCPU *cpu, SpaprCpuCore *sc)
+{
+ SpaprCpuState *spapr_cpu = spapr_cpu_state(cpu);
+
+ cpu->machine_data = NULL;
+ g_free(spapr_cpu);
+ object_unparent(OBJECT(cpu));
+}
+
static void spapr_cpu_core_unrealize(DeviceState *dev)
{
SpaprCpuCore *sc = SPAPR_CPU_CORE(OBJECT(dev));
@@ -224,6 +232,9 @@ static void spapr_cpu_core_unrealize(DeviceState *dev)
for (i = 0; i < cc->nr_threads; i++) {
spapr_unrealize_vcpu(sc->threads[i], sc);
}
+ for (i = 0; i < cc->nr_threads; i++) {
+ spapr_delete_vcpu(sc->threads[i], sc);
+ }
g_free(sc->threads);
}
@@ -294,15 +305,6 @@ err:
return NULL;
}
-static void spapr_delete_vcpu(PowerPCCPU *cpu, SpaprCpuCore *sc)
-{
- SpaprCpuState *spapr_cpu = spapr_cpu_state(cpu);
-
- cpu->machine_data = NULL;
- g_free(spapr_cpu);
- object_unparent(OBJECT(cpu));
-}
-
static void spapr_cpu_core_realize(DeviceState *dev, Error **errp)
{
/* We don't use SPAPR_MACHINE() in order to exit gracefully if the user
- [PATCH v2 0/5] spapr: Fix and cleanups for sPAPR CPU core, Greg Kurz, 2020/10/15
- [PATCH v2 3/5] spapr: Drop spapr_delete_vcpu() unused argument, Greg Kurz, 2020/10/15
- [PATCH v2 4/5] spapr: Make spapr_cpu_core_unrealize() idempotent, Greg Kurz, 2020/10/15
- [PATCH v2 2/5] spapr: Unrealize vCPUs with qdev_unrealize(), Greg Kurz, 2020/10/15
- [PATCH v2 1/5] spapr: Fix leak of CPU machine specific data,
Greg Kurz <=
- [PATCH v2 5/5] spapr: Simplify spapr_cpu_core_realize() and spapr_cpu_core_unrealize(), Greg Kurz, 2020/10/15
- Re: [PATCH v2 0/5] spapr: Fix and cleanups for sPAPR CPU core, David Gibson, 2020/10/22