On 11/07/2018 20:43, Thomas Huth wrote:
>> - realize fails
> In this case, the failure is before realize is attempted,
> qdev_device_add() already stop with "Device '%s' can not be hotplugged
> on this machine".
Still, object_unparent is called by qdev_device_add in the error path,
and it should work the same way (in a nutshell, recursive unparent when
child properties are deleted, and finalization of the contained objects
as the last reference is dropped).
>> - object_unparent is called on the device that failed to realize (see
>> qdev_device_add). object_unparent calls device_unparent
> Hmm, are you sure? I can see that object_unparent calls device_unparent
> indirectly for the *child* nodes of the device, but not for the device
object_unparent -> object_property_del_child ->
object_finalize_child_property -> device_unparent
I think you're on the right track, after object_property_add_child you
need to drop the reference to the object. For example qmp_device_add
does it after qdev_device_add returns a device successfully (just an
example---I understand it is not the case with bcm283x). In that case
the call to object_property_add_child is in qdev_set_id.