Il 05/07/2013 05:26, Liu Ping Fan ha scritto: > 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.
This is wrong, unrealize is where the resources should be made invisible to the guest. This removes a bunch of references to the memory regions (from the flatview, from the parent region, etc.). Ultimately causes finalization to be called (after we add RCU, finalization will happen at the next grace period, because some of the references are removed from call_rcu callbacks). What you want is http://permalink.gmane.org/gmane.comp.emulators.qemu/214871. Paolo > 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)); >