[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v4 08/13] qdev: move unrealization of devices from f
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PATCH v4 08/13] qdev: move unrealization of devices from finalize to unparent |
Date: |
Fri, 25 Jan 2013 14:12:34 +0100 |
Similarly, a bus holds a reference back to the device, and this will
prevent the device from going away as soon as this reference is counted
properly. To avoid this, move the unrealization of devices to the
unparent callback. This includes recursively unparenting all the buses
and (after the previous patch) the devices on those buses, which ensures
that the web of references completely disappears for all devices that
reside (in the qdev tree) below the one being unplugged.
After this patch, the qdev tree and the bus<->child relationship is
defined as "A is above B, iff unplugging A will automatically unplug B".
Signed-off-by: Paolo Bonzini <address@hidden>
---
hw/qdev.c | 35 +++++++++++++++++------------------
1 file changed, 17 insertions(+), 18 deletions(-)
diff --git a/hw/qdev.c b/hw/qdev.c
index 3c1ec7d..6f1b311 100644
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -738,23 +738,8 @@ static void device_initfn(Object *obj)
static void device_finalize(Object *obj)
{
DeviceState *dev = DEVICE(obj);
- BusState *bus;
- DeviceClass *dc = DEVICE_GET_CLASS(dev);
-
- if (dev->realized) {
- while (dev->num_child_bus) {
- bus = QLIST_FIRST(&dev->child_bus);
- qbus_free(bus);
- }
- if (qdev_get_vmsd(dev)) {
- vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
- }
- if (dc->exit) {
- dc->exit(dev);
- }
- if (dev->opts) {
- qemu_opts_del(dev->opts);
- }
+ if (dev->opts) {
+ qemu_opts_del(dev->opts);
}
}
@@ -771,8 +756,22 @@ static void device_class_base_init(ObjectClass *class,
void *data)
static void device_unparent(Object *obj)
{
DeviceState *dev = DEVICE(obj);
+ DeviceClass *dc = DEVICE_GET_CLASS(dev);
+ BusState *bus;
- if (dev->parent_bus != NULL) {
+ while (dev->num_child_bus) {
+ bus = QLIST_FIRST(&dev->child_bus);
+ qbus_free(bus);
+ }
+ if (dev->realized) {
+ if (qdev_get_vmsd(dev)) {
+ vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
+ }
+ if (dc->exit) {
+ dc->exit(dev);
+ }
+ }
+ if (dev->parent_bus) {
bus_remove_child(dev->parent_bus, dev);
}
}
--
1.8.1
- [Qemu-devel] [PATCH for-1.4 v4 00/12] qdev: correct reference counting, Paolo Bonzini, 2013/01/25
- [Qemu-devel] [PATCH v4 06/13] qdev: add reference count to a device for the BusChild, Paolo Bonzini, 2013/01/25
- [Qemu-devel] [PATCH v4 03/13] pci: use qbus_create in pci_bus_new, Paolo Bonzini, 2013/01/25
- [Qemu-devel] [PATCH v4 01/13] qdev: remove duplication between qbus_create and qbus_create_inplace, Paolo Bonzini, 2013/01/25
- [Qemu-devel] [PATCH v4 04/13] qom: preserve object while unparenting it, Paolo Bonzini, 2013/01/25
- [Qemu-devel] [PATCH v4 02/13] qdev: change first argument of qbus_create_inplace to void *, Paolo Bonzini, 2013/01/25
- [Qemu-devel] [PATCH v4 05/13] qom: document reference counting of link properties, Paolo Bonzini, 2013/01/25
- [Qemu-devel] [PATCH v4 08/13] qdev: move unrealization of devices from finalize to unparent,
Paolo Bonzini <=
- [Qemu-devel] [PATCH v4 09/13] qdev: add reference for the bus while it is referred to by the DeviceState, Paolo Bonzini, 2013/01/25
- [Qemu-devel] [PATCH v4 11/13] qdev: drop extra references at creation time, Paolo Bonzini, 2013/01/25
- [Qemu-devel] [PATCH v4 12/13] cpu: do not use object_delete, Paolo Bonzini, 2013/01/25
- [Qemu-devel] [PATCH v4 10/13] qdev: inline object_delete into qbus_free/qdev_free, Paolo Bonzini, 2013/01/25
- [Qemu-devel] [PATCH v4 07/13] qdev: move deletion of children from finalize to unparent, Paolo Bonzini, 2013/01/25
- [Qemu-devel] [PATCH v4 13/13] qom: remove object_delete, Paolo Bonzini, 2013/01/25