qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 3/4] spapr: Introduce an .instance_finalize hook for TYPE_SPAPR_C


From: Greg Kurz
Subject: [PATCH 3/4] spapr: Introduce an .instance_finalize hook for TYPE_SPAPR_CPU_CORE
Date: Mon, 12 Oct 2020 17:20:00 +0200
User-agent: StGit/0.21

The array of vCPUs and each individual vCPU under the core can be freed
in several locations. This is suboptimal and increases the odds of memory
leaks in future changes.

Actually they can be freed altogether when the core itself is ultimately
freed in a finalize hook. Initialize the array with zeroes so that the
finalize hook can be made idempotent.

Signed-off-by: Greg Kurz <groug@kaod.org>
---
 hw/ppc/spapr_cpu_core.c |   26 +++++++++++++++++---------
 1 file changed, 17 insertions(+), 9 deletions(-)

diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
index 64ce6a0cb781..cffd74f542ba 100644
--- a/hw/ppc/spapr_cpu_core.c
+++ b/hw/ppc/spapr_cpu_core.c
@@ -197,7 +197,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));
-    spapr_delete_vcpu(cpu);
 }
 
 /*
@@ -233,7 +232,6 @@ static void spapr_cpu_core_unrealize(DeviceState *dev)
     for (i = 0; i < cc->nr_threads; i++) {
         spapr_unrealize_vcpu(sc->threads[i], sc);
     }
-    g_free(sc->threads);
 }
 
 static bool spapr_realize_vcpu(PowerPCCPU *cpu, SpaprMachineState *spapr,
@@ -320,11 +318,11 @@ static void spapr_cpu_core_realize(DeviceState *dev, 
Error **errp)
         return;
     }
 
-    sc->threads = g_new(PowerPCCPU *, cc->nr_threads);
+    sc->threads = g_new0(PowerPCCPU *, cc->nr_threads);
     for (i = 0; i < cc->nr_threads; i++) {
         sc->threads[i] = spapr_create_vcpu(sc, i, errp);
         if (!sc->threads[i]) {
-            goto err;
+            return;
         }
     }
 
@@ -341,11 +339,6 @@ err_unrealize:
     while (--j >= 0) {
         spapr_unrealize_vcpu(sc->threads[j], sc);
     }
-err:
-    while (--i >= 0) {
-        spapr_delete_vcpu(sc->threads[i]);
-    }
-    g_free(sc->threads);
 }
 
 static Property spapr_cpu_core_properties[] = {
@@ -367,6 +360,20 @@ static void spapr_cpu_core_class_init(ObjectClass *oc, 
void *data)
     scc->cpu_type = data;
 }
 
+static void spapr_cpu_core_instance_finalize(Object *obj)
+{
+    SpaprCpuCore *sc = SPAPR_CPU_CORE(obj);
+    CPUCore *cc = CPU_CORE(sc);
+    int i;
+
+    for (i = 0; i < cc->nr_threads; i++) {
+        if (sc->threads[i]) {
+            spapr_delete_vcpu(sc->threads[i]);
+        }
+    }
+    g_free(sc->threads);
+}
+
 #define DEFINE_SPAPR_CPU_CORE_TYPE(cpu_model) \
     {                                                   \
         .parent = TYPE_SPAPR_CPU_CORE,                  \
@@ -382,6 +389,7 @@ static const TypeInfo spapr_cpu_core_type_infos[] = {
         .abstract = true,
         .instance_size = sizeof(SpaprCpuCore),
         .class_size = sizeof(SpaprCpuCoreClass),
+        .instance_finalize = spapr_cpu_core_instance_finalize,
     },
     DEFINE_SPAPR_CPU_CORE_TYPE("970_v2.2"),
     DEFINE_SPAPR_CPU_CORE_TYPE("970mp_v1.0"),





reply via email to

[Prev in Thread] Current Thread [Next in Thread]