From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Cc: aliguori@us.ibm.com, afaerber@suse.de
Subject: [Qemu-devel] [PATCH 06/11] qdev: move unrealization of devices from finalize to unparent
Date: Wed, 5 Dec 2012 21:44:37 +0100 [thread overview]
Message-ID: <1354740282-20679-7-git-send-email-pbonzini@redhat.com> (raw)
In-Reply-To: <1354740282-20679-1-git-send-email-pbonzini@redhat.com>
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 <pbonzini@redhat.com>
---
hw/qdev.c | 37 +++++++++++++++++++------------------
1 file changed, 19 insertions(+), 18 deletions(-)
diff --git a/hw/qdev.c b/hw/qdev.c
index 12b1529..d7f1545 100644
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -699,23 +699,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->state == DEV_STATE_INITIALIZED) {
- 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);
}
}
@@ -732,8 +717,24 @@ static void device_class_base_init(ObjectClass *class, void *data)
static void qdev_remove_from_bus(Object *obj)
{
DeviceState *dev = DEVICE(obj);
+ DeviceClass *dc = DEVICE_GET_CLASS(dev);
+ BusState *bus;
- bus_remove_child(dev->parent_bus, dev);
+ while (dev->num_child_bus) {
+ bus = QLIST_FIRST(&dev->child_bus);
+ qbus_free(bus);
+ }
+ if (dev->state == DEV_STATE_INITIALIZED) {
+ 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);
+ }
}
static void device_class_init(ObjectClass *class, void *data)
--
1.8.0.1
next prev parent reply other threads:[~2012-12-05 20:45 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-12-05 20:44 [Qemu-devel] [PATCH 00/11] qdev: correct reference counting Paolo Bonzini
2012-12-05 20:44 ` [Qemu-devel] [PATCH 01/11] qdev: export and use qbus_init Paolo Bonzini
2012-12-18 21:18 ` Andreas Färber
2012-12-05 20:44 ` [Qemu-devel] [PATCH 02/11] qdev: use object_new, not g_malloc to create buses Paolo Bonzini
2012-12-05 20:44 ` [Qemu-devel] [PATCH 03/11] qom: preserve object while unparenting it Paolo Bonzini
2012-12-18 20:43 ` Andreas Färber
2012-12-05 20:44 ` [Qemu-devel] [PATCH 04/11] qdev: add reference count to a device for the BusChild Paolo Bonzini
2013-01-07 20:26 ` Anthony Liguori
2013-01-09 13:23 ` Paolo Bonzini
2012-12-05 20:44 ` [Qemu-devel] [PATCH 05/11] qdev: move deletion of children from finalize to unparent Paolo Bonzini
2012-12-05 20:44 ` Paolo Bonzini [this message]
2012-12-05 20:44 ` [Qemu-devel] [PATCH 07/11] qdev: add reference for the bus while it is referred to by the DeviceState Paolo Bonzini
2013-01-07 20:29 ` Anthony Liguori
2013-01-09 13:25 ` Paolo Bonzini
2012-12-05 20:44 ` [Qemu-devel] [PATCH 08/11] qdev: inline object_delete into qbus_free/qdev_free Paolo Bonzini
2012-12-05 20:44 ` [Qemu-devel] [PATCH 09/11] qdev: drop extra references at creation time Paolo Bonzini
2012-12-05 20:44 ` [Qemu-devel] [PATCH 10/11] cpu: do not use object_delete Paolo Bonzini
2012-12-18 21:07 ` Andreas Färber
2012-12-18 21:19 ` Paolo Bonzini
2012-12-05 20:44 ` [Qemu-devel] [PATCH 11/11] qom: remove object_delete Paolo Bonzini
2012-12-17 13:07 ` [Qemu-devel] [PATCH 00/11] qdev: correct reference counting Paolo Bonzini
2013-01-07 20:31 ` Anthony Liguori
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1354740282-20679-7-git-send-email-pbonzini@redhat.com \
--to=pbonzini@redhat.com \
--cc=afaerber@suse.de \
--cc=aliguori@us.ibm.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).