[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v3 0/7] Do not unparent in instance_finalize()



On 2025/09/17 20:57, Daniel P. Berrangé wrote:
On Wed, Sep 17, 2025 at 07:13:25PM +0900, Akihiko Odaki wrote:
Based-on: <cover.1751493467.git.balaton@xxxxxxxxxx>
("[PATCH v2 00/14] hw/pci-host/raven clean ups")

Supersedes: <20240829-memory-v1-1-ac07af2f4fa5@xxxxxxxxxx>
("[PATCH] docs/devel: Prohibit calling object_unparent() for memory region")

Children are automatically unparented so manually unparenting is
unnecessary.

Where is automatic unparenting you're referring to being done ?

Worse, automatic unparenting happens before the instance_finalize()
callback of the parent gets called, so object_unparent() calls in
the callback will refer to objects that are already unparented, which
is semantically incorrect.

IIUC, object_property_add_child will acquire a reference on
the child, and object_property_del_child (and thus
object_unparent) will release that reference.

The 'object_finalize' method, and thus 'instance_finalize'
callback, won't be invoked until the last reference is
dropped on the object in question.

IOW, it should be impossible for 'object_finalize' to ever
run, as long as the child has a parent set.

So if we're in the 'finalize' then 'object_unparent' must
be a no-op as the child must already have no references
held and thus no parent.

IOW, the reason to remove 'object_unparent' calls from
finalize is surely because they do nothing at all,
rather than this talk about callbacks being run at the
wrong time ?

This patch series deals with the situation where the parent calls object_unparent() in its instance_finalize() callback. The process of finalization looks like as follows:

1. The parent's reference count reaches to zero. Please note that there can be remaining children that are referenced by the parent at this point.

2. object_finalize() is called.

2a. object_property_del_all() is called and the parent releases references to its children. This is what I referred as "automatic unparenting". The children without any other references will be finalized here.

2b. instance_finalize() is called. Past children may be already finalized, and calling object_unparent() here will cause dereferencing finalized objects in that case, which should be avoided.

Regards,
Akihiko Odaki



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.