Am 25. Februar 2026 05:55:21 UTC schrieb "Philippe Mathieu-Daudé" 
<[email protected]>:
>+Bernhard
>
>On 24/2/26 13:22, Mark Cave-Ayland wrote:
>> On 24/02/2026 11:10, Peter Maydell wrote:
>> 
>>> On Tue, 24 Feb 2026 at 09:48, Daniel P. Berrangé <[email protected]> 
>>> wrote:
>>>> IMHO, it is slightly more subtle - people believe they are already
>>>> adding children.
>>>> 
>>>> Consider this code.
>>>> 
>>>>      port92 = isa_create_simple(isa_bus, TYPE_PORT92);
>>>> 
>>>> my reading of that is that I'm creating a "port92" device that is a
>>>> child of "isa_bus". Why would I need to tell QEMU that it is a child
>>>> for a second time ?
>>>> 
>>>> If I trace calls through isa_create_simple I get to a call to:
>>>> 
>>>>     qdev_realize_and_unref(dev, parent, errp);
>>>> 
>>>> and once I again I'm left wondering why I would need to tell
>>>> QEMU 'dev' is a child of 'parent' a second time.
>>>> 
>>>> Of course I know the answer. We need to give a name for the
>>>> child and it isn't trivial to "do the right thing" to invent
>>>> an automatic name.
>>>> 
>>>> Still, overall I'm inclined to largely blame our API designs for
>>>> not guiding people into doing the right thing.
>>>> 
>>>> 
>>>> Picking another random unattached set of objects "smbus-eeprom"
>>>> I again find they've being created with qdev_realize_and_unref.
>>>> 
>>>> Pick another unattached device 'i8259_init_chip', and again
>>>> we end up calling into qdev_realize_and_unref()
>>>> 
>>>> 
>>>> It feels like qdev_realize_and_unref() is a common point of
>>>> blame in unattached devices. IMHO it ought to be taking a
>>>> "const char *name" parameter.
>>> 
>>> I think that is because this is the function that is used
>>> in older code that predates the "everything should be in
>>> the QOM tree" model. Newer code doesn't use it, I think;
>>> and it's not surprising that old pre-QOM code doesn't do
>>> anything to put objects into the QOM tree.
>>> 
>>> The two patterns are:
>>> 
>>>   dev = qdev_new(...);
>>>   ...
>>>   qdev_realize_and_unref(dev, bus, errp);
>>> 
>>> and
>>> 
>>>   object_initialize_child(...);
>>>   ...
>>>   qdev_realize(dev, bus, errp);
>>> 
>>> This also is somewhat tangled up with the question of whether you want:
>>> 
>>>   * call a function which allocates memory and initializes it
>>>     with an object of this type
>>>   * I have the memory here, init the object in-place
>>> 
>>> If we could come to a definite conclusion on what we want then
>>> we would probably be in a better position to try to enforce it.
>
>I recall a previous discussion where we said in-place allocation
>does not scale with dynamic machines (data driven config), and IIRC
>Bernhard said by switching to dynamic heap allocation we'd use more
>QOM cast macros and lose compiler safety type checks. Can't find it
>now in the archives.

It was probably this comment about type safety which was unrelated to heap 
allocations: 
https://lore.kernel.org/qemu-devel/[email protected]/

Best regards,
Bernhard

>
>We have some model declension where we allocate in-place $MAX members
>and expose a QOM property to initialize up to that number (or worst,
>de-initialize and unparent what is left!) in the DeviceRealize handler.
>Not "in-place" could simplify this.
>
>> Exactly this! I think what tends to happen is that we get stuck in 
>> situations where someone suggests an improvement, but then we get hung up 
>> trying to work out the corner-cases where it doesn't work and then things 
>> don't progress.
>> 
>> The approach I believe we need to take is to work out what we want the API 
>> and QOM tree to look like first, and then work backwards from there.
>> 
>> I tend to be in agreement with Akihiko's argument that we want to deprecate 
>> in-place initialisation with object_initialize_child() and simply use 
>> refcounting everywhere because then we don't hit any lifcycle issues if 
>> something retains a reference to the internal object (memory regions!).
>> 
>> The questions I think we need to answer as a starting point:
>> 
>>    1. Which API shall we converge on: qdev or QOM? Can we come up with a
>>       code sample(s) showing what we want object/device initialisation to
>>       look lie? Longer term can we unify the QOM and qdev trees?
>> 
>>    2. Should we convert to use external object allocation with
>>       refcounting?
>> 
>>    3. How do we handle memory regions? With Akihiko's recent refcount
>>       fixes then Zoltan's memory region changes could work: I don't agree
>>       with the motivation of simplifying devices as I think it's i)
>>       subjective and ii) harder to debug if we lose the pointer to the
>>       memory region, but I can see how it fixes the RCU-thread doing an
>>       unref after the owner device has already been destroyed issue.
>> 
>> As several people have already pointed out in this thread, we do have a poor 
>> track record of API conversions but the introduction of memory regions shows 
>> how this can be done successfully.
>> 
>> Given that we already have multiple ways of doing the same thing, I tend to 
>> lean against not introducing yet-another-API unless we can come up with a 
>> long-term strategy for its use. In particular this causes problems in review 
>> where e.g. one reviewer may want to use QOM to setup a device whilst another 
>> may want to use qdev which is confusing for everyone, including the code 
>> submitter.
>> 
>> If we can at least get an answer to 1) then I'd be willing to have a go at 
>> writing some kind of specification document and put it out for feedback...
>> 
>> 
>> ATB,
>> 
>> Mark.
>> 
>> 
>

Reply via email to