summaryrefslogtreecommitdiff
path: root/hw/s390x/event-facility.c
diff options
context:
space:
mode:
authorDavid Hildenbrand <dahi@linux.vnet.ibm.com>2015-10-01 10:49:45 +0200
committerChristian Borntraeger <borntraeger@de.ibm.com>2015-10-02 13:31:52 +0200
commit7059384c7e27d68c502d8636eb711873a9a6a597 (patch)
tree236a9b1f3ffc16d262a946e5d44dc49111223c4d /hw/s390x/event-facility.c
parent8a641ff60f38799a10ed44a7c5bddd386bc169ed (diff)
downloadqemu-7059384c7e27d68c502d8636eb711873a9a6a597.tar.gz
s390x: set missing parent for hotplug and quiesce events
Existing code missed to set a parent for the quiesce and hotplug event. While this didn't matter in practise, new introspection APIs basically now do an object_unref(object_new(T)), which loops forever. When trying to remove the event facility bus, the code tries to unparent all childs on the bus, so they are properly deleted and therefore removed. As object_unparent() on these child devices doesn't work, as there is no parent, we loop forever. Let's fix this by adding the event facility as a parent. Also switch from object_initialize to object_new, so the only valid reference is in fact the parent property. This makes it more obvious when the device (state) is actually gone (and how the reference counting works). Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com> Signed-off-by: Jens Freimann <jfrei@linux.vnet.ibm.com> Message-Id: <1443689387-34473-4-git-send-email-jfrei@linux.vnet.ibm.com> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Diffstat (limited to 'hw/s390x/event-facility.c')
-rw-r--r--hw/s390x/event-facility.c20
1 files changed, 10 insertions, 10 deletions
diff --git a/hw/s390x/event-facility.c b/hw/s390x/event-facility.c
index ef2a05160a..907b48560c 100644
--- a/hw/s390x/event-facility.c
+++ b/hw/s390x/event-facility.c
@@ -27,8 +27,6 @@ typedef struct SCLPEventsBus {
struct SCLPEventFacility {
SysBusDevice parent_obj;
SCLPEventsBus sbus;
- SCLPEvent quiesce_event;
- SCLPEvent cpu_hotplug_event;
/* guest' receive mask */
unsigned int receive_mask;
};
@@ -347,19 +345,21 @@ static void init_event_facility(Object *obj)
{
SCLPEventFacility *event_facility = EVENT_FACILITY(obj);
DeviceState *sdev = DEVICE(obj);
+ Object *new;
/* Spawn a new bus for SCLP events */
qbus_create_inplace(&event_facility->sbus, sizeof(event_facility->sbus),
TYPE_SCLP_EVENTS_BUS, sdev, NULL);
- object_initialize(&event_facility->quiesce_event, sizeof(SCLPEvent),
- TYPE_SCLP_QUIESCE);
- qdev_set_parent_bus(DEVICE(&event_facility->quiesce_event),
- &event_facility->sbus.qbus);
- object_initialize(&event_facility->cpu_hotplug_event, sizeof(SCLPEvent),
- TYPE_SCLP_CPU_HOTPLUG);
- qdev_set_parent_bus(DEVICE(&event_facility->cpu_hotplug_event),
- &event_facility->sbus.qbus);
+ new = object_new(TYPE_SCLP_QUIESCE);
+ object_property_add_child(obj, TYPE_SCLP_QUIESCE, new, NULL);
+ object_unref(new);
+ qdev_set_parent_bus(DEVICE(new), &event_facility->sbus.qbus);
+
+ new = object_new(TYPE_SCLP_CPU_HOTPLUG);
+ object_property_add_child(obj, TYPE_SCLP_CPU_HOTPLUG, new, NULL);
+ object_unref(new);
+ qdev_set_parent_bus(DEVICE(new), &event_facility->sbus.qbus);
/* the facility will automatically realize the devices via the bus */
}