On 02/02/2012 10:45 AM, Paolo Bonzini wrote:
The reference that is returned by qdev_device_add is never given
back, so that device_del does not cause the refcount to go to zero
(and thus does nothing).
Signed-off-by: Paolo Bonzini<pbonz...@redhat.com>
This isn't needed in qom-upstream.14. Here's why:
object_init does not increase the reference count
object_property_add_child increases the reference count
object_new increases the reference count
object_delete decrements the reference count
object_property_del_child decreases the reference count
object_delete calls object_property_del_child(obj->parent, obj)
qdev_device_add calls object_new and object_property_add_child
-> ref == 2
qdev_device_del calls object_delete
-> ref -= 2
In qom-upstream.13, object_delete wasn't calling object_property_del_child which
is why you saw the behavior you did. This problem would still exist with a
composed device so dropping the reference here isn't enough.
Regards,
Anthony Liguori
---
vl.c | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/vl.c b/vl.c
index d88a18c..c63af69 100644
--- a/vl.c
+++ b/vl.c
@@ -1746,6 +1746,7 @@ static int device_init_func(QemuOpts *opts, void *opaque)
dev = qdev_device_add(opts);
if (!dev)
return -1;
+ object_unref(OBJECT(dev));
return 0;
}