hw/ppc: Use object_initialize_child for correct reference counting
Both functions, object_initialize() and object_property_add_child() increase the reference counter of the new object, so one of the references has to be dropped afterwards to get the reference counting right. Otherwise the child object will not be properly cleaned up when the parent gets destroyed. Thus let's use now object_initialize_child() instead to get the reference counting here right. Suggested-by: Eduardo Habkost <ehabkost@redhat.com> Signed-off-by: Thomas Huth <thuth@redhat.com> Message-Id: <1550748288-30598-1-git-send-email-thuth@redhat.com> Reviewed-by: Cédric Le Goater <clg@kaod.org> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
3dbe65c178
commit
f6d4dca807
@ -244,13 +244,12 @@ static void spapr_xive_instance_init(Object *obj)
|
||||
{
|
||||
sPAPRXive *xive = SPAPR_XIVE(obj);
|
||||
|
||||
object_initialize(&xive->source, sizeof(xive->source), TYPE_XIVE_SOURCE);
|
||||
object_property_add_child(obj, "source", OBJECT(&xive->source), NULL);
|
||||
object_initialize_child(obj, "source", &xive->source, sizeof(xive->source),
|
||||
TYPE_XIVE_SOURCE, &error_abort, NULL);
|
||||
|
||||
object_initialize(&xive->end_source, sizeof(xive->end_source),
|
||||
TYPE_XIVE_END_SOURCE);
|
||||
object_property_add_child(obj, "end_source", OBJECT(&xive->end_source),
|
||||
NULL);
|
||||
object_initialize_child(obj, "end_source", &xive->end_source,
|
||||
sizeof(xive->end_source), TYPE_XIVE_END_SOURCE,
|
||||
&error_abort, NULL);
|
||||
}
|
||||
|
||||
static void spapr_xive_realize(DeviceState *dev, Error **errp)
|
||||
|
12
hw/ppc/pnv.c
12
hw/ppc/pnv.c
@ -736,18 +736,18 @@ static void pnv_chip_power8_instance_init(Object *obj)
|
||||
{
|
||||
Pnv8Chip *chip8 = PNV8_CHIP(obj);
|
||||
|
||||
object_initialize(&chip8->psi, sizeof(chip8->psi), TYPE_PNV_PSI);
|
||||
object_property_add_child(obj, "psi", OBJECT(&chip8->psi), NULL);
|
||||
object_initialize_child(obj, "psi", &chip8->psi, sizeof(chip8->psi),
|
||||
TYPE_PNV_PSI, &error_abort, NULL);
|
||||
object_property_add_const_link(OBJECT(&chip8->psi), "xics",
|
||||
OBJECT(qdev_get_machine()), &error_abort);
|
||||
|
||||
object_initialize(&chip8->lpc, sizeof(chip8->lpc), TYPE_PNV_LPC);
|
||||
object_property_add_child(obj, "lpc", OBJECT(&chip8->lpc), NULL);
|
||||
object_initialize_child(obj, "lpc", &chip8->lpc, sizeof(chip8->lpc),
|
||||
TYPE_PNV_LPC, &error_abort, NULL);
|
||||
object_property_add_const_link(OBJECT(&chip8->lpc), "psi",
|
||||
OBJECT(&chip8->psi), &error_abort);
|
||||
|
||||
object_initialize(&chip8->occ, sizeof(chip8->occ), TYPE_PNV_OCC);
|
||||
object_property_add_child(obj, "occ", OBJECT(&chip8->occ), NULL);
|
||||
object_initialize_child(obj, "occ", &chip8->occ, sizeof(chip8->occ),
|
||||
TYPE_PNV_OCC, &error_abort, NULL);
|
||||
object_property_add_const_link(OBJECT(&chip8->occ), "psi",
|
||||
OBJECT(&chip8->psi), &error_abort);
|
||||
}
|
||||
|
@ -444,8 +444,8 @@ static void pnv_psi_init(Object *obj)
|
||||
{
|
||||
PnvPsi *psi = PNV_PSI(obj);
|
||||
|
||||
object_initialize(&psi->ics, sizeof(psi->ics), TYPE_ICS_SIMPLE);
|
||||
object_property_add_child(obj, "ics-psi", OBJECT(&psi->ics), NULL);
|
||||
object_initialize_child(obj, "ics-psi", &psi->ics, sizeof(psi->ics),
|
||||
TYPE_ICS_SIMPLE, &error_abort, NULL);
|
||||
}
|
||||
|
||||
static const uint8_t irq_to_xivr[] = {
|
||||
|
@ -1776,9 +1776,9 @@ static void spapr_create_nvram(sPAPRMachineState *spapr)
|
||||
|
||||
static void spapr_rtc_create(sPAPRMachineState *spapr)
|
||||
{
|
||||
object_initialize(&spapr->rtc, sizeof(spapr->rtc), TYPE_SPAPR_RTC);
|
||||
object_property_add_child(OBJECT(spapr), "rtc", OBJECT(&spapr->rtc),
|
||||
&error_fatal);
|
||||
object_initialize_child(OBJECT(spapr), "rtc",
|
||||
&spapr->rtc, sizeof(spapr->rtc), TYPE_SPAPR_RTC,
|
||||
&error_fatal, NULL);
|
||||
object_property_set_bool(OBJECT(&spapr->rtc), true, "realized",
|
||||
&error_fatal);
|
||||
object_property_add_alias(OBJECT(spapr), "rtc-time", OBJECT(&spapr->rtc),
|
||||
|
Loading…
Reference in New Issue
Block a user