From: Zhao Liu <zhao1.liu@intel.com>
To: "Daniel P. Berrangé" <berrange@redhat.com>
Cc: "Paolo Bonzini" <pbonzini@redhat.com>,
"Eduardo Habkost" <eduardo@habkost.net>,
"Markus Armbruster" <armbru@redhat.com>,
"Thomas Huth" <thuth@redhat.com>,
"Igor Mammedov" <imammedo@redhat.com>,
"Philippe Mathieu-Daudé" <philmd@linaro.org>,
"Richard Henderson" <richard.henderson@linaro.org>,
"Peter Maydell" <peter.maydell@linaro.org>,
"Michael S . Tsirkin" <mst@redhat.com>,
"BALATON Zoltan" <balaton@eik.bme.hu>,
"Mark Cave-Ayland" <mark.caveayland@nutanix.com>,
"Pierrick Bouvier" <pierrick.bouvier@linaro.org>,
"Zide Chen" <zide.chen@intel.com>,
"Dapeng Mi" <dapeng1.mi@linux.intel.com>,
qemu-devel@nongnu.org, devel@lists.libvirt.org,
"Zhao Liu" <zhao1.liu@intel.com>
Subject: Re: [PATCH v2 00/21] qom: introduce property flags to track external user input
Date: Wed, 11 Feb 2026 15:06:23 +0800 [thread overview]
Message-ID: <aYwqb2MR+CjFfDtg@intel.com> (raw)
In-Reply-To: <aYtRooiYCc8LzUUJ@redhat.com>
> So the main thing that pushes us into using QOM for internal properties
> is the machine type compatibility code. eg where we bulk set stuff using
>
> compat_props_add(m->compat_props, hw_compat_7_0, hw_compat_7_0_len);
> compat_props_add(m->compat_props, pc_compat_7_0, pc_compat_7_0_len);
>
> That logic is all QOM based. Using QOM isn't our exclusive approach, as
> we have machine types sometimes setting object fields directly. eg
>
> static void pc_i440fx_machine_7_0_options(MachineClass *m)
> {
> PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
> pc_i440fx_machine_7_1_options(m);
> pcmc->enforce_amd_1tb_hole = false;
> compat_props_add(m->compat_props, hw_compat_7_0, hw_compat_7_0_len);
> compat_props_add(m->compat_props, pc_compat_7_0, pc_compat_7_0_len);
> }
>
> but that only works for properties against the machine type, not compat
> properties against devices, since we have no direct access to the other
> classes/instances.
Right, and setting fields directly is only possible for machine-level
state, not for device properties created dynamically during
realize/init. So QOM-based compat properties are indeed inescapable
for devices.
> If we want to be able to control hardware compat, without exposing
> something as a user facing tunable, then internal-only QOM props seems
> inescapable.
Agreed.
> I do still wonder if we genuinely need internal-only QOM props for
> machine type compat ?
>
> Whether using a public 'x-' prefixed property or an internal only
> property, we're constrained by the need to retain the behaviour
> semantics for as long as the machine type exists. I don't see an
> internal only property giving us significantly more freedom here.
> We can already rename a 'x-' property however we want with no
> notice, as long as the machine type doesn't change behaviour.
Hmm, I think x- prefix is already semantically overloaded. Looking at
the current codebase, x- carries two very different meanings:
- "unstable but user-facing feature" - e.g. x-vga, x-igd-opregion
(documented in docs/igd-assign.rst with user-facing examples),
x-migration-multifd-transfer (documented in
docs/devel/vfio-migration.rst).
- "internal compat switch to fix bug" - e.g. x-buggy-eim,
x-pci-express-writeable-slt-bug.
These two categories have fundamentally different contracts - the
former should be settable by users, the latter should not. But today,
nothing prevents a user from writing something like:
"-device intel-iommu,x-buggy-eim=false"
QEMU will happily accept it.
An INTERNAL flag can reject this at property set time with a clear
error.
And management tools use qom-list-properties to discover settable
properties (though this series hasn't covered this but it's
possible) - they currently have no way to distinguish "x-vga"
(user-facing) from "x-pci-express-writeable-slt-bug" (internal
bug-compat). An INTERNAL flag could give a clean boundary for
introspection.
> I don't think it does. Code evolution is painful as long as the machine
> type using the prop needs to exist with fixed semantics, whether it is
> internal or public with x- prefix.
I agree the machine type lifetime constraint doesn't change.
But experimental x- or normal (external) properties are by default
exposed to users, allowing them to set values via -device or other
entry points. This effectively treats the property as an API.
Once it becomes an API, any modification to the property must consider
whether there are external dependencies. Just as with the series
(removing v2.6 & v2.7 PC machines) I referenced in cover letter,
justifying whether a property can be directly removed becomes very
complicated and unpredictable - some are definitely in use, while some
are merely "potentially" in use.
Let me take the recently added compatibility properties as another
example - they are all x86 CPU properties:
* x-l1-cache-per-thread: it's useful for external user to tune L1
cache topology (though now we have smp-cache, before smp-cache,
it was useful).
* x-consistent-cache: this actually is a fix and should be
internal-only.
While both are compatibility properties and share the x- prefix,
their purposes differ, reflecting the confusion around x- prefix I
mentioned earlier. It's also expected that distinct strategies will
be required when genuinely considering the removal of these two
categories of properties in the future. :-(
So the advantage of distinguishing between internal and external
properties is that modifications or even removal of internal
properties can be done directly without worrying about external
consumers. External properties, as potential API objects, require
explicit deprecation before they can be dropped.
Although it doesn't directly help with modifying existing properties,
any newly added internal property won't increase such API concerns
going forward.
So I'm not positioning INTERNAL as a replacement for x- prefix -
rather, it complements x- by providing runtime enforcement, clean
introspection, and preventing accidental ABI commitment that a naming
convention alone cannot. x- remains appropriate for
unstable-but-user-facing features.
Thanks,
Zhao
next prev parent reply other threads:[~2026-02-11 6:40 UTC|newest]
Thread overview: 68+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-10 3:23 [PATCH v2 00/21] qom: introduce property flags to track external user input Zhao Liu
2026-02-10 3:23 ` [PATCH v2 01/21] qom/object: use BIT macro for ObjectPropertyFlags Zhao Liu
2026-03-20 9:53 ` Thomas Huth
2026-02-10 3:23 ` [PATCH v2 02/21] qom/object: cache ObjectPropertyFlags in ObjectProperty Zhao Liu
2026-03-20 9:53 ` Thomas Huth
2026-02-10 3:23 ` [PATCH v2 03/21] qom/object: factor out object_class_property_try_add() Zhao Liu
2026-02-10 14:41 ` BALATON Zoltan
2026-02-11 7:14 ` Zhao Liu
2026-02-10 3:23 ` [PATCH v2 04/21] qom/object: add flags argument in object_{class_}property_try_add() Zhao Liu
2026-02-10 3:23 ` [PATCH v2 05/21] qom/object: rename object_{class_}property_try_add() to object_{class_}property_add_full() Zhao Liu
2026-02-10 3:23 ` [PATCH v2 06/21] qom/object: add helpers to set/get/clear property flags Zhao Liu
2026-02-10 3:23 ` [PATCH v2 07/21] qom/object: introduce user interaction flags for properties Zhao Liu
2026-02-10 9:49 ` Daniel P. Berrangé
2026-02-10 9:58 ` Daniel P. Berrangé
2026-02-11 8:19 ` Zhao Liu
2026-02-10 14:44 ` BALATON Zoltan
2026-02-11 7:22 ` Zhao Liu
2026-02-10 3:23 ` [PATCH v2 08/21] qom/object: add from_user argument in object_property_parse() Zhao Liu
2026-02-10 3:23 ` [PATCH v2 09/21] qom/object: mark global property set from CLI as USER_SET Zhao Liu
2026-02-10 3:23 ` [PATCH v2 10/21] qom/qom-hmp-cmd: mark properties set from HMP (non-JSON) "qom-set" " Zhao Liu
2026-02-10 3:23 ` [PATCH v2 11/21] qom/qom-qmp-cmd: mark properties set from QMP/HMP (JSON) " Zhao Liu
2026-02-10 3:23 ` [PATCH v2 12/21] qom/object_interfaces: mark properties set from qdict & keyval " Zhao Liu
2026-02-10 3:23 ` [PATCH v2 13/21] system/vl: mark property set in object_parse_property_opt() " Zhao Liu
2026-02-10 3:23 ` [PATCH v2 14/21] hw/core/qdev-properties: allow qdev properties accept flags Zhao Liu
2026-02-10 9:41 ` Peter Krempa
2026-02-11 7:10 ` Zhao Liu
2026-02-10 9:56 ` Daniel P. Berrangé
2026-02-11 7:30 ` Zhao Liu
2026-02-11 16:58 ` Daniel P. Berrangé
2026-02-12 15:25 ` Zhao Liu
2026-02-12 15:42 ` Daniel P. Berrangé
2026-03-09 13:34 ` Zhao Liu
2026-02-18 9:51 ` Igor Mammedov
2026-03-06 9:14 ` Markus Armbruster
2026-03-06 9:19 ` Daniel P. Berrangé
2026-03-06 9:30 ` Markus Armbruster
2026-03-09 13:52 ` Zhao Liu
2026-02-10 3:23 ` [PATCH v2 15/21] target/i386: deprecate fill-mtrr-mask property Zhao Liu
2026-02-10 3:23 ` [PATCH v2 16/21] target/i386: deprecate cpuid-0xb property Zhao Liu
2026-02-10 3:23 ` [PATCH v2 17/21] hw/intc/ioapic: deprecate version property Zhao Liu
2026-02-10 3:23 ` [PATCH v2 18/21] target/i386: mark x-consistent-cache property as internal-only Zhao Liu
2026-02-10 3:23 ` [PATCH v2 19/21] target/i386: remove redundant validation for lbr-fmt property Zhao Liu
2026-03-13 22:34 ` Chen, Zide
2026-02-10 3:23 ` [PATCH v2 20/21] target/i386: detect user provided lbr-fmt via property flag Zhao Liu
2026-03-13 22:36 ` Chen, Zide
2026-02-10 3:23 ` [PATCH v2 21/21] hw/core/qdev-properties: support valid default value for DEFINE_PROP_UINT64_CHECKMASK Zhao Liu
2026-03-13 22:36 ` Chen, Zide
2026-02-10 10:12 ` [PATCH v2 00/21] qom: introduce property flags to track external user input Daniel P. Berrangé
2026-02-10 10:44 ` Michael S. Tsirkin
2026-02-10 11:00 ` Daniel P. Berrangé
2026-02-10 15:00 ` BALATON Zoltan
2026-02-10 15:28 ` Zhao Liu
2026-02-10 15:16 ` BALATON Zoltan
2026-02-11 7:24 ` Zhao Liu
2026-02-11 11:28 ` BALATON Zoltan
2026-02-12 15:31 ` Zhao Liu
2026-02-12 15:56 ` BALATON Zoltan
2026-02-10 15:41 ` Daniel P. Berrangé
2026-02-11 7:06 ` Zhao Liu [this message]
2026-02-11 11:18 ` Daniel P. Berrangé
2026-03-11 13:05 ` Markus Armbruster
2026-03-11 13:14 ` Daniel P. Berrangé
2026-03-11 13:38 ` Peter Krempa
2026-03-16 15:43 ` Markus Armbruster
2026-03-16 16:05 ` BALATON Zoltan
2026-03-16 18:00 ` Markus Armbruster
2026-03-20 10:09 ` Daniel P. Berrangé
2026-03-23 15:37 ` Kevin Wolf
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=aYwqb2MR+CjFfDtg@intel.com \
--to=zhao1.liu@intel.com \
--cc=armbru@redhat.com \
--cc=balaton@eik.bme.hu \
--cc=berrange@redhat.com \
--cc=dapeng1.mi@linux.intel.com \
--cc=devel@lists.libvirt.org \
--cc=eduardo@habkost.net \
--cc=imammedo@redhat.com \
--cc=mark.caveayland@nutanix.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=philmd@linaro.org \
--cc=pierrick.bouvier@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
--cc=thuth@redhat.com \
--cc=zide.chen@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