On Wed, Dec 02, 2020 at 02:26:44PM +0100, Paolo Bonzini wrote:
On 02/12/20 13:51, Eduardo Habkost wrote:
> > > 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.
We do not have to convert everything _if_ for some objects there are good
reasons to do programmatically-generated properties. CPUs might be one of
those cases (or if we decide to convert them, they might endure some more
code duplication than other devices because they have so many properties).
OK, we just need to agree on what the transition will look like
when we do it. I think we should put as much care into
transition/glue infrastructure as we put into the new
infrastructure.
> 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.
For user-creatable objects Kevin is doing work in lockstep on all classes;
but once we have the infrastructure for QAPI object configuration schemas we
can proceed in the other direction and operate on one device at a time.
With some handwaving, something like (see create_unimplemented_device)
DeviceState *dev = qdev_new(TYPE_UNIMPLEMENTED_DEVICE);
qdev_prop_set_string(dev, "name", name);
qdev_prop_set_uint64(dev, "size", size);
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
might become something like
{ 'object': 'unimplemented-device',
'config': {
'name': 'str',
'size': 'size'
},
}
DeviceState *dev = qapi_Unimplemented_new(&(
(UnimplementedDeviceOptions) {
.name = name,
.size = size
}, &error_fatal);
object_unref(dev);
(i.e. all typesafe!) and the underlying code would be something like
[...]
Looks nice as end goal. Then, these are a few questions I would
have about the transition plan:
Would it require changing both device implementation and device
users in lockstep? Should we have a compatibility layer to allow
existing qdev_new()+qdev_prop_set_*() code to keep working after
the devices are converted to the new system? If not, why not?
If we add a compatibility layer, is the end goal to convert all
existing qdev_new() users to the new system? If yes, why? If
not, why not?
What about subclasses? Would base classes need to be converted
in lockstep with all subclasses? How would the transition
process of (e.g.) PCI devices look like?
--
Eduardo