From: Anthony Liguori <anthony@codemonkey.ws>
To: Paolo Bonzini <pbonzini@redhat.com>, Liu Ping Fan <qemulist@gmail.com>
Cc: Liu Ping Fan <pingfank@linux.vnet.ibm.com>, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH] qom: removal of link property need to release its target
Date: Wed, 22 Aug 2012 11:36:05 -0500 [thread overview]
Message-ID: <877gsqlw96.fsf@codemonkey.ws> (raw)
In-Reply-To: <5034CA4C.7020706@redhat.com>
Paolo Bonzini <pbonzini@redhat.com> writes:
> Il 22/08/2012 05:02, Liu Ping Fan ha scritto:
>> From: Liu Ping Fan <pingfank@linux.vnet.ibm.com>
>>
>> Currently, link property's target is only managed by
>> object_set_link_property(). This will raise such issue that when
>> the property is finalized, its target has no opportunity to release.
>>
>> Fix this issue by introduce object_finalize_link_property()
>>
>> Signed-off-by: Liu Ping Fan <pingfank@linux.vnet.ibm.com>
>
> Acked-by: Paolo Bonzini <pbonzini@redhat.com>
This patch is correct but it uncovers a bigger problem. Short of
reworking most of the hotplug code, I can't find an easy fix.
The first problem is that with this patch, all links are unreferenced at
property removal. Right now, bus children are added as links but when
they are added, the link is already set (there is no explicit set).
This means that those links never get the extra reference.
We can fix this by adding an extra reference in add_link but this
creates yet another problem with hotplug. Specificially, qdev_free()
asserts that ref > 0 because there is now a reference being held by the
bus.
This is the same problem we have with object_unparent.
The key problem here is how unplug is implemented. Unplug wants to be
both synchronous and asynchronous.
I think we need to do the following:
1) Move object_unparent to qdev_device_del (the parent is added by
qdev_device_add so this is quite logical).
2) Make DeviceState::unplug *never* call qdev_free().
3) Add an "unplugged" NotifierList to DeviceState.
4) Change the various hotplug consumers to call qdev_set_parent_bus() to
NULL to unplug the device from the bus. Change qdev_set_parent_bus()
to allow this and remove the bus link and invoke the unplugged notifier.
5) Change qdev_device_del() to add a notifier to the object that calls
object_unparent() and object_unref.
6) Rename DeviceState::unplug to DeviceState::request_unplug
7) Take Ping Fan's patch + another patch to add a reference count in
object_property_add_link
Regards,
Anthony Liguori
>
> Paolo
>
>> ---
>> qom/object.c | 12 +++++++++++-
>> 1 files changed, 11 insertions(+), 1 deletions(-)
>>
>> diff --git a/qom/object.c b/qom/object.c
>> index a552be2..76b3d34 100644
>> --- a/qom/object.c
>> +++ b/qom/object.c
>> @@ -957,6 +957,16 @@ static void object_set_link_property(Object *obj, Visitor *v, void *opaque,
>> }
>> }
>>
>> +static void object_finalize_link_property(Object *obj, const char *name,
>> + void *opaque)
>> +{
>> + Object **child = opaque;
>> +
>> + if (*child != NULL) {
>> + object_unref(*child);
>> + }
>> +}
>> +
>> void object_property_add_link(Object *obj, const char *name,
>> const char *type, Object **child,
>> Error **errp)
>> @@ -968,7 +978,7 @@ void object_property_add_link(Object *obj, const char *name,
>> object_property_add(obj, name, full_type,
>> object_get_link_property,
>> object_set_link_property,
>> - NULL, child, errp);
>> + object_finalize_link_property, child, errp);
>>
>> g_free(full_type);
>> }
>>
next prev parent reply other threads:[~2012-08-22 16:36 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-22 3:02 [Qemu-devel] [PATCH] qom: removal of link property need to release its target Liu Ping Fan
2012-08-22 12:02 ` Paolo Bonzini
2012-08-22 16:36 ` Anthony Liguori [this message]
2012-08-22 20:55 ` Paolo Bonzini
2012-08-22 21:41 ` Anthony Liguori
2012-08-22 22:01 ` Paolo Bonzini
2012-08-22 22:40 ` Anthony Liguori
2012-08-23 8:35 ` Paolo Bonzini
2012-08-23 8:02 ` liu ping fan
2012-08-22 17:07 ` Andreas Färber
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=877gsqlw96.fsf@codemonkey.ws \
--to=anthony@codemonkey.ws \
--cc=pbonzini@redhat.com \
--cc=pingfank@linux.vnet.ibm.com \
--cc=qemu-devel@nongnu.org \
--cc=qemulist@gmail.com \
/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).