From: Akihiko Odaki <akihiko.odaki@daynix.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: "Jason Wang" <jasowang@redhat.com>,
"Dmitry Fleytman" <dmitry.fleytman@gmail.com>,
"Sriram Yagnaraman" <sriram.yagnaraman@ericsson.com>,
"Michael S. Tsirkin" <mst@redhat.com>,
"Luigi Rizzo" <rizzo@iet.unipi.it>,
"Giuseppe Lettieri" <g.lettieri@iet.unipi.it>,
"Vincenzo Maffione" <v.maffione@gmail.com>,
"Andrew Melnychenko" <andrew@daynix.com>,
"Yuri Benditovich" <yuri.benditovich@daynix.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Daniel P. Berrangé" <berrange@redhat.com>,
"Eduardo Habkost" <eduardo@habkost.net>,
"Michael Roth" <michael.roth@amd.com>,
"Marcel Apfelbaum" <marcel.apfelbaum@gmail.com>,
"Philippe Mathieu-Daudé" <philmd@linaro.org>,
"Yanan Wang" <wangyanan55@huawei.com>,
"Zhao Liu" <zhao1.liu@intel.com>, "Lei Yang" <leiyang@redhat.com>,
qemu-devel@nongnu.org
Subject: Re: [PATCH v4 2/4] qdev-properties: Accept bool for OnOffAuto
Date: Thu, 6 Feb 2025 19:16:44 +0900 [thread overview]
Message-ID: <6e6935dd-fae7-4cce-acad-69609eba9b6e@daynix.com> (raw)
In-Reply-To: <87r04bs8sj.fsf@pond.sub.org>
On 2025/02/06 18:48, Markus Armbruster wrote:
> Akihiko Odaki <akihiko.odaki@daynix.com> writes:
>
>> On 2025/02/06 0:29, Markus Armbruster wrote:
>>> Akihiko Odaki <akihiko.odaki@daynix.com> writes:
>>>
>>>> Accept bool literals for OnOffAuto properties for consistency with bool
>>>> properties. This enables users to set the "on" or "off" value in a
>>>> uniform syntax without knowing whether the "auto" value is accepted.
>>>> This behavior is especially useful when converting an existing bool
>>>> property to OnOffAuto or vice versa.
>>>>
>>>> Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
>>>> ---
>>>> hw/core/qdev-properties.c | 17 ++++++++++++++++-
>>>> 1 file changed, 16 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
>>>> index 434a76f5036e..0081d79f9b7b 100644
>>>> --- a/hw/core/qdev-properties.c
>>>> +++ b/hw/core/qdev-properties.c
>>>> @@ -491,6 +491,21 @@ const PropertyInfo qdev_prop_string = {
>>>> .set = set_string,
>>>> };
>>>>
>>>> +static void set_on_off_auto(Object *obj, Visitor *v, const char *name,
>>>> + void *opaque, Error **errp)
>>>> +{
>>>> + Property *prop = opaque;
>>>> + int *ptr = object_field_prop_ptr(obj, prop);
>>>> + bool value;
>>>> +
>>>> + if (visit_type_bool(v, name, &value, NULL)) {
>>>> + *ptr = value ? ON_OFF_AUTO_ON : ON_OFF_AUTO_OFF;
>>>> + return;
>>>> + }
>>>> +
>>>> + qdev_propinfo_set_enum(obj, v, name, opaque, errp);
>>>> +}
>>>> +
>>>> /* --- on/off/auto --- */
>>>>
>>>> const PropertyInfo qdev_prop_on_off_auto = {
>>>> @@ -498,7 +513,7 @@ const PropertyInfo qdev_prop_on_off_auto = {
>>>> .description = "on/off/auto",
>>>> .enum_table = &OnOffAuto_lookup,
>>>> .get = qdev_propinfo_get_enum,
>>>> - .set = qdev_propinfo_set_enum,
>>>> + .set = set_on_off_auto,
>>>> .set_default_value = qdev_propinfo_set_default_value_enum,
>>>> };
>>>
>>> The qdev properties defined with DEFINE_PROP_ON_OFF_AUTO() now
>>> additionally accept bool.
>>>
>>> The commit message tries to explain why this change is useful, but it
>>> leaves me confused.
>>>
>>> Does this solve a problem with existing properties? If yes, what
>>> exactly is the problem?
>>>
>>> Or does this enable new uses of DEFINE_PROP_ON_OFF_AUTO()?
>>>
>>> I'm trying to understand, but my gut feeling is "bad idea".
>>>
>>> Having multiple ways to express the same thing is generally undesirable.
>>> In this case, "foo": "on" and "foo": true, as well as "foo": "off" and
>>> "foo": false.
>>>
>>> Moreover, OnOffAuto then has two meanings: straightfoward enum as
>>> defined in the QAPI schema, and the funny qdev property. This is
>>> definitely a bad idea. DEFINE_PROP_T(), where T is some QAPI type,
>>> should accept *exactly* the values of T. If these properties need to
>>> accept something else, use another name to not invite confusion.
>>>
>>> If I understand the cover letter correctly, you want to make certain
>>> bool properties tri-state for some reason. I haven't looked closely
>>> enough to judge whether that makes sense. But do you really have to
>>> change a whole bunch of unrelated properties to solve your problem?
>>> This is going to be a very hard sell.
>>>
>>
>> I change various virtio properties because they all have a common
>> problem. The problem is, when the host does not support a virtio
>> capability, virtio devices automatically set capability properties false
>> even if the user explicitly sets them true.
First, I'd like to thank you for your detailed reply.
>
> I understand we have something like this:
>
> * true: on if possible, else off
>
> * false: off (always possible)
>
> Which one is the default?
It depends. Some properties have true by default. The others have false.
>
> There is no way to reliably configure "on", i.e. fail if it's not
> possible. I agree that's a problem.
>
>> This problem can be solved
>> using an existing mechanism, OnOffAuto, which differentiates the "auto"
>> state and explicit the "on" state.
>
> I guess you're proposing something like this:
>
> * auto: on if possible, else off
>
> * on: on if possible, else error
>
> * off: off (always possible)
>
> Which one is the default?
I converted on to auto and off to false in a following patch.
>
>> However, converting bool to OnOffAuto surfaces another problem: they
>> disagree how "on" and "off" should be written. Please note that the
>> disagreement already exists and so it is nice to solve anyway.
>
> Yes, converting bool to OnOffAuto is an incompatible change.
Not just about conversion, but this inconsistency require users to know
whether a property is bool or OnOffAuto and change how the values are
written in JSON accordingly. This somewhat hurts usability.
>
>> This patch tries to solve it by tolerating bool values for OnOffAuto. As
>> you pointed out, this approach has a downside: it makes OnOffAuto more
>> complicated by having multiple ways to express the same thing.
>
> It also affects existing uses of OnOffAuto, where such a change is
> unnecessary and undesirable.
>
>> Another approach is to have one unified way to express "on"/"off" for
>> bool and OnOffAuto. This will give three options in total:
>>
>> 1. Let OnOffAuto accept JSON bool and "on"/"off" (what this patch does)
>
> The parenthesis is inaccurate. This patch only affects qdev properties.
> It does not affect use of OnOffAuto elsewhere, e.g. QOM object
> "sev-guest" property "legacy-vm-type", or QMP command blockdev-add
> argument "locking" with driver "file".
>
>> 2. Let OnOffAuto and bool accept JSON bool and deprecate "on"/"off"
>> 3. Let OnOffAuto and bool accept "on"/"off" and deprecate JSON bool
>
> For each of these options:
>
> (a) Change exactly the uses of OnOffAuto that need to become tri-state
>
> (b) Change all qdev properties (currently a superset of (a); what this
> patch does)
>
> (c) Change all uses of OnOffAuto
>
> I dislike (c) and especially (b).
>
>> I'm fine with either of these approaches; they are at least better than
>> the current situation where users need to care if the value is OnOffAuto
>> or bool when they just want to express on/off. Please tell me what you
>> prefer.
>
> We managed to maneuver ourselves into a bit of a corner in just a few
> simple steps:
>
> * The obvious type for a flag is bool.
>
> * The obvious type for a small set of values is enum.
>
> * Thus, the obvious type for a tri-state is enum.
>
> * But this prevents growing a flag into a tri-state compatibly. Which
> is what you want to do.
>
> However, we actually have a second way to do a tri-state: optional bool,
> i.e. present and true, present and false, absent.
>
> Permit me a digression... I'm not a fan of assigning "absent" a meaning
> different from any present value. But it's a design choice QAPI made.
It's a new insight I didn't know. Properties in qdev have a default
value instead of special "absent". But if QAPI does have special
"absent", perhaps qdev may be modified to align with.
>
> Using optional that way can occasionally lead to trouble. Consider
> migrate-set-parameters. Its arguments are all optional. For each
> argument present, the respective migration parameter is set to the
> argument value. You cannot use this to reset a migration parameter from
> present to absent. Matters for parameters where "absent" has a meaning
> different from any "present" value.
>
> End of digression.
>
> Start of next digression :)
>
> Note that qdev properties are generally optional. The only way to make
> them mandatory is to reject their default value in .realize(). When
> users set this default value explicitly, the error message will almost
> certainly be confusing.
>
> End of digression.
>
> Optional bool may enable a fourth solution:
>
> 4. Make "absent" mean on if possible, else off, "present and true" mean
> on if possible, else error, and "present and false" mean off (always
> possible).
>
> This changes the meaning of "present and true", but it's precisely
> the change you want, isn't it?
We have "false by default" properties so it unfortunately does not work.
>
> Yet another solutions:
>
> 5. Alternate of bool and an enum with a single value "auto".
>
> Falls apart with the keyval visitor used for the command line.
> Fixable, I believe, but a good chunk of work and complexity.
I may have missed something, but I think that will break JSON string
literals "on" and "off".
Regards,
Akihiko Odaki
>
> My gut feeling: explore 4. first.
>
next prev parent reply other threads:[~2025-02-06 10:17 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-08 6:17 [PATCH v4 0/4] virtio: Convert feature properties to OnOffAuto Akihiko Odaki
2025-01-08 6:17 ` [PATCH v4 1/4] qapi: Do not consume a value if failed Akihiko Odaki
2025-01-08 6:17 ` [PATCH v4 2/4] qdev-properties: Accept bool for OnOffAuto Akihiko Odaki
2025-01-10 11:09 ` Daniel P. Berrangé
2025-01-10 11:31 ` Akihiko Odaki
2025-01-10 12:16 ` Daniel P. Berrangé
2025-01-10 12:32 ` Akihiko Odaki
2025-02-06 9:43 ` Markus Armbruster
2025-02-05 15:29 ` Markus Armbruster
2025-02-06 6:01 ` Akihiko Odaki
2025-02-06 9:48 ` Markus Armbruster
2025-02-06 10:16 ` Akihiko Odaki [this message]
2025-02-06 13:23 ` BALATON Zoltan
2025-02-07 5:59 ` Akihiko Odaki
2025-02-07 12:31 ` Markus Armbruster
2025-02-07 12:46 ` Daniel P. Berrangé
2025-05-05 6:42 ` Akihiko Odaki
2025-02-07 12:15 ` Markus Armbruster
2025-05-06 15:37 ` Markus Armbruster
2025-05-06 16:25 ` BALATON Zoltan
2025-05-08 7:09 ` Akihiko Odaki
2025-01-08 6:17 ` [PATCH v4 3/4] qdev-properties: Add DEFINE_PROP_ON_OFF_AUTO_BIT64() Akihiko Odaki
2025-01-08 6:17 ` [PATCH v4 4/4] virtio: Convert feature properties to OnOffAuto Akihiko Odaki
2025-01-09 10:06 ` Lei Yang
2025-01-09 10:56 ` Philippe Mathieu-Daudé
2025-01-09 11:08 ` Akihiko Odaki
2025-01-09 11:13 ` Philippe Mathieu-Daudé
2025-01-10 11:23 ` Daniel P. Berrangé
2025-01-10 11:39 ` Akihiko Odaki
2025-01-09 12:53 ` [PATCH v4 0/4] " Markus Armbruster
2025-01-10 4:42 ` Akihiko Odaki
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=6e6935dd-fae7-4cce-acad-69609eba9b6e@daynix.com \
--to=akihiko.odaki@daynix.com \
--cc=andrew@daynix.com \
--cc=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=dmitry.fleytman@gmail.com \
--cc=eduardo@habkost.net \
--cc=g.lettieri@iet.unipi.it \
--cc=jasowang@redhat.com \
--cc=leiyang@redhat.com \
--cc=marcel.apfelbaum@gmail.com \
--cc=michael.roth@amd.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=philmd@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=rizzo@iet.unipi.it \
--cc=sriram.yagnaraman@ericsson.com \
--cc=v.maffione@gmail.com \
--cc=wangyanan55@huawei.com \
--cc=yuri.benditovich@daynix.com \
--cc=zhao1.liu@intel.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).