On Wed, 13 Jun 2018 16:57:05 +1000 David Gibson <da...@gibson.dropbear.id.au> wrote:
> Currently we don't have any unrealize path for pnv cpu cores. We get away > with this because we don't yet support cpu hotplug for pnv. > > However, we're going to want it eventually, and in the meantime, it makes > it non-obvious why there are a bunch of allocations on the realize() path > that don't have matching frees. > > So, implement the missing unrealize path. > > Signed-off-by: David Gibson <da...@gibson.dropbear.id.au> > --- Reviewed-by: Greg Kurz <gr...@kaod.org> > hw/ppc/pnv_core.c | 21 +++++++++++++++++++++ > 1 file changed, 21 insertions(+) > > diff --git a/hw/ppc/pnv_core.c b/hw/ppc/pnv_core.c > index c9648fd1ad..c70dbbe056 100644 > --- a/hw/ppc/pnv_core.c > +++ b/hw/ppc/pnv_core.c > @@ -192,6 +192,26 @@ err: > error_propagate(errp, local_err); > } > > +static void pnv_unrealize_vcpu(PowerPCCPU *cpu) > +{ > + qemu_unregister_reset(pnv_cpu_reset, cpu); > + object_unparent(cpu->intc); > + cpu_remove_sync(CPU(cpu)); > + object_unparent(OBJECT(cpu)); > +} > + > +static void pnv_core_unrealize(DeviceState *dev, Error **errp) > +{ > + PnvCore *pc = PNV_CORE(dev); > + CPUCore *cc = CPU_CORE(dev); > + int i; > + > + for (i = 0; i < cc->nr_threads; i++) { > + pnv_unrealize_vcpu(pc->threads[i]); > + } > + g_free(pc->threads); > +} > + > static Property pnv_core_properties[] = { > DEFINE_PROP_UINT32("pir", PnvCore, pir, 0), > DEFINE_PROP_END_OF_LIST(), > @@ -202,6 +222,7 @@ static void pnv_core_class_init(ObjectClass *oc, void > *data) > DeviceClass *dc = DEVICE_CLASS(oc); > > dc->realize = pnv_core_realize; > + dc->unrealize = pnv_core_unrealize; > dc->props = pnv_core_properties; > } >