Currently, unrealized is triggered in device_unparent(). But unrealized normally involves the reclaim of resource occupied by DeviceState. To obey the idiom that reclaiming resource when refcnt reach zero, move it on the path of object_finalize().
As for device_unparent(), it would be the place to detach the device from the other system. Signed-off-by: Liu Ping Fan <pingf...@linux.vnet.ibm.com> --- hw/core/qdev.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/hw/core/qdev.c b/hw/core/qdev.c index 9190a7e..4258d8a 100644 --- a/hw/core/qdev.c +++ b/hw/core/qdev.c @@ -768,6 +768,10 @@ static void device_initfn(Object *obj) static void device_finalize(Object *obj) { DeviceState *dev = DEVICE(obj); + + if (dev->realized) { + object_property_set_bool(obj, false, "realized", NULL); + } if (dev->opts) { qemu_opts_del(dev->opts); } @@ -794,9 +798,6 @@ static void device_unparent(Object *obj) bus = QLIST_FIRST(&dev->child_bus); qbus_free(bus); } - if (dev->realized) { - object_property_set_bool(obj, false, "realized", NULL); - } if (dev->parent_bus) { bus_remove_child(dev->parent_bus, dev); object_unref(OBJECT(dev->parent_bus)); -- 1.8.1.4