From: Markus Armbruster <armbru@redhat.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: "Philippe Mathieu-Daudé" <philmd@redhat.com>,
"Daniel P. Berrangé" <berrange@redhat.com>,
"Eduardo Habkost" <ehabkost@redhat.com>,
"Pratik Parvati" <pratikp@vayavyalabs.com>,
qemu-devel@nongnu.org
Subject: Re: sysbus_create_simple Vs qdev_create
Date: Thu, 30 Jul 2020 14:36:45 +0200 [thread overview]
Message-ID: <87zh7hxjqa.fsf@dusky.pond.sub.org> (raw)
In-Reply-To: <0d7a9407-1df6-0c9b-0695-2f438f0de129@redhat.com> (Paolo Bonzini's message of "Thu, 30 Jul 2020 13:09:58 +0200")
Paolo Bonzini <pbonzini@redhat.com> writes:
> On 30/07/20 12:03, Markus Armbruster wrote:
>> qdev C layer:
>>
>> frob->prop = 42;
>>
>> Least cognitive load.
>>
>> QOM has no C layer.
>
> Not really, a QOM object is totally free to do frob->prop = 42. And
> just like we didn't do that outside device implementation in qdev as our
> tithe to the Church of Information Hiding; the same applies to QOM.
I screwed up the part of my argument that actually has a hope to be
valid, let me try again.
With qdev, you can always do frob->prop = 42, because properties are
always backed by a struct member.
With QOM, properties are built around visitor-based getters and setters.
This means you can always do (but never actually would do) something
like
fortytwo = qnum_from_int(42);
v = qobject_input_visitor_new(fortytwo);
set_prop(OBJECT(frob), v, "prop", cookie, &err);
visit_free(v);
qobject_unref(fortytwo);
where set_prop() is the setter you passed to object_property_add(), and
@cookie is the opaque value you passed along with it.
*Maybe* set_prop() wraps around a simpler setter you can call directly,
or even a struct member you can set directy. QOM does not care.
And that's my point: QOM does not care for the C layer.
>> qdev property layer works even when @frob has incomplete type:
>>
>> qdev_prop_set_int32(DEVICE(frob), "prop", 42);
>>
>> This used to map property name to struct offset & copy the value.
>> Simple, stupid.
>>
>> Nowadays, it is the same as
>>
>> object_property_set_int(OBJECT(frob), "frob", 42, &error_abort);
>>
>> which first converts the int to a QObject, then uses a QObject input
>> visitor with a virtual walk to convert it back to int and store it in
>> @frob. It's quite a sight in the debugger.
>
> Yes, but thatt's just because we never bothered to create single-type
> visitors. For a good reason though: I don't think the extra QAPI code
> is worth (not even that much) nicer backtraces when we already have a
> QObject as a battle-tested variant type.
>
>> qdev "text" layer is really a QemuOpts layer (because that's what we had
>> back then). If we have prop=42 in a QemuOpts, it calls
>>
>> set_property("prop", "42", frob, &err);
>>
>> Nowadays, this is a thin wrapper around object_property_parse(),
>> basically
>>
>> object_property_parse(frob, "prop", 42, &err);
>>
>> Fine print: except set_property() does nothing for @prop "driver" and
>> "bus", which look just like properties in -device / device-add, but
>> aren't.
>
> Ugly indeed. They should be special cased up in the caller, probably,
> or use the long-discussed "remainder" feature of the QAPI schema.
qdev_device_add() is still stuck in the QemuOpts age.
>> object_property_parse() uses the string input visitor, which I loathe.
>
> Apart from the list syntax, the string input visitor is decent I think.
It's a death trap:
/*
* The string input visitor does not implement support for visiting
* QAPI structs, alternates, null, or arbitrary QTypes. Only flat lists
* of integers (except type "size") are supported.
*/
"Does not implement support for visiting" is polite language for
"crashes when you dare to visit".
>>>> I've long had the nagging feeling that if we had special-cased
>>>> containers, children and links, we could have made a QOM that was easier
>>>> to reason about, and much easier to integrate with a QAPI schema.
>>>
>>> That's at least plausible. But I have a nagging feeling that it would
>>> only cover 99% of what we're doing with QOM. :)
>>
>> The question is whether that 1% really should be done the way it is done
>> :)
>
> And that's a very fair question, but it implies non-trivial design work,
> so the smiley changes to a frown. :(
True!
next prev parent reply other threads:[~2020-07-30 12:37 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-07-14 16:09 sysbus_create_simple Vs qdev_create Pratik Parvati
2020-07-14 16:17 ` Pratik Parvati
2020-07-14 17:02 ` Philippe Mathieu-Daudé
2020-07-15 8:32 ` Markus Armbruster
2020-07-15 13:58 ` Pratik Parvati
2020-07-15 14:11 ` Peter Maydell
2020-07-15 14:37 ` Markus Armbruster
2020-07-16 22:21 ` Eduardo Habkost
2020-07-17 5:10 ` Markus Armbruster
2020-07-17 16:23 ` Eduardo Habkost
2020-07-17 16:30 ` Daniel P. Berrangé
2020-07-17 17:15 ` Peter Maydell
2020-07-20 7:39 ` Markus Armbruster
2020-07-20 7:38 ` Markus Armbruster
2020-07-20 15:59 ` Eduardo Habkost
2020-07-21 6:00 ` Markus Armbruster
2020-07-27 14:29 ` Paolo Bonzini
2020-07-28 7:19 ` Markus Armbruster
2020-07-28 17:38 ` Paolo Bonzini
2020-07-28 22:47 ` Eduardo Habkost
2020-07-29 9:54 ` Paolo Bonzini
2020-07-29 13:18 ` Markus Armbruster
2020-07-29 16:08 ` Paolo Bonzini
2020-07-30 10:03 ` Markus Armbruster
2020-07-30 11:09 ` Paolo Bonzini
2020-07-30 12:36 ` Markus Armbruster [this message]
2020-07-30 13:38 ` Paolo Bonzini
2020-07-29 14:32 ` Eduardo Habkost
2020-07-29 16:01 ` Paolo Bonzini
2020-07-29 16:08 ` Eduardo Habkost
2020-07-29 16:14 ` Paolo Bonzini
2020-07-29 7:46 ` Markus Armbruster
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87zh7hxjqa.fsf@dusky.pond.sub.org \
--to=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=ehabkost@redhat.com \
--cc=pbonzini@redhat.com \
--cc=philmd@redhat.com \
--cc=pratikp@vayavyalabs.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.