On Wed, Dec 02, 2020 at 10:30:11AM +0100, Paolo Bonzini wrote:
On 01/12/20 23:08, Eduardo Habkost wrote:
> > Properties are only a useful concept if they have a use. If
> > -object/object_add/object-add can do the same job without properties,
> > properties are not needed anymore.
>
> Do you mean "not needed for -object anymore"? Properties are
> still used by internal C code (esp. board code),
> -device/device_add, -machine, -cpu, and debugging commands (like
> "info qtree" and qom-list/qom-get/qom-set).
Yes.
> > Right now QOM is all about exposing properties, and having multiple
> > interfaces to set them (by picking a different visitor). But in practice
> > most QOM objects have a lifetime that consists of 1) set properties 2) flip
> > a switch (realized/complete/open) 3) let the object live on its own. 1+2
> > are a single monitor command or CLI option; during 3 you access the object
> > through monitor commands, not properties.
>
> I agree with this, except for the word "all" in "QOM is all
> about". QOM is also an extensively used internal QEMU API,
> including internal usage of the QOM property system.
Yeah, "all about exposing properties" includes internal usage. And you're
right that some "phase 3" monitor commands do work at the property level
(mostly "info qtree", but also "qom-get" because there are some cases
of
public run-time properties).
I still disagree on the "all about" part even for internal usage.
But this shouldn't really matter for this discussion, I guess.
> I'm liking the direction this is taking. However, I would still
> like to have a clearer and feasible plan that would work for
> -device, -machine, and -cpu.
-cpu is not a problem since it's generally created with a static
configuration (now done with global properties, in the future it could be a
struct).
It is a problem if it requires manually converting existing code
defining CPU properties and we don't have a transition plan.
-machine and -device in principle could be done the same way as -object,
just through a different registry (_not_ a huge struct; that's an acceptable
stopgap for -object but that's it). The static aka field properties would
remain as read-only, with defaults moved to instance_init or realize. But
there would be again "triplication" with a trivial conversion:
1) in the QAPI schema, e.g. 'num_queues': 'int16'
2) in the struct, "int16_t num_queues;"
3) in the realize function,
s->num_queues = cfg->has_num_queues ? cfg->num_queues : 8;
So having a mechanism for defaults in the QAPI schema would be good. Maybe
'num_queues': { 'type': 'int16', 'default': '8'
}?
Would a -device conversion also involve non-user-creatable
devices, or would we keep existing internal usage of QOM
properties?
Even if it's just for user-creatable devices, getting rid of QOM
property usage in devices sounds like a very ambitious goal. I'd
like us to have a good transition plan, in addition to declaring
what's our ideal end goal.
I also need to review more the part of this code with respect to the
application of global properties. I wonder if there are visitor tricks that
we can do, so that global properties keep working but correspond to QAPI
fields instead of QOM properties.
Paolo
--
Eduardo