On 18/08/2026 12:10, Marc-André Lureau wrote:
Hi,This series connects QOM and qdev properties to the QAPI type system, so that management tools can discover the QAPI schema type of each object property. Today, QOM properties carry a free-form "type" string ("bool", "uint32", "OnOffAuto", ..) that has no formal link to the QAPI schema exposed by query-qmp-schema. Management tools must maintain ad-hoc mappings or rely on naming conventions to figure out how to interpret property values. This series adds: - A new QAPITypeInfo struct that pairs a property with its QAPI schema type name, enum lookup table, and list-element type. - A QAPI code generator (qapi-type-infos) that emits a QAPITypeInfo instance for every schema-defined type, including the mapping between internal C names and the schema name visible to clients. - A "qapi-type" field in the ObjectPropertyInfo and ObjectPropertyValue QMP structs, populated from the QAPITypeInfo when present giving clients a cross-reference into query-qmp-schema output. - Conversion of all PropertyInfo definitions from the old .type/.enum_table strings to the new .qapi_type pointer. - Replacement of the generic qdev_prop_array with typed per-element array PropertyInfos, removing the arrayinfo/arrayfieldsize indirection from struct Property. - Removal of the deprecated PropertyInfo.type and .enum_table fields, and of the old object_property_add_enum/add_tm APIs. Along the way, a few pre-existing type mismatches in property definitions are fixed, the "struct tm" RTC property is replaced with a proper QAPI StructTm type etc. Introducing more specific types or a "typedef" to QAPI could help provide better associated type informations than plain "str" in many cases, for example. Comments welcome!
Thanks for quite a substantial piece work: there is quite a lot to pick through in this series which makes review tricky. If you post a new version, it might be worth showing an example of the before/after JSON to help give some context around the changes: however it feels this is going in the right direction, since it works towards the goal of allowing a QMP client to introspect everything it needs to know about the QAPI type underlying a property.
I've started working through this with a few comments and reviews for the patches fixing up types: I wonder if the type fixups could be merged separately to help reduce the size of the series?
Question: is the eventual aim to deprecate the use of all the non-qapi object functions? Are there many instances left after this series at all?
Signed-off-by: Marc-André Lureau <[email protected]> --- Changes in v3: - QAPI analysis redesign (replacing the old "expose name map" from introspect) - all non-implicit QAPI types are now introspectable, including QOM-only types - QAPITypeInfo.schema_name -> masked_name - exposes integer signedness and width through query-qmp-schema - various extra property fixes - rebase, some patch split or merge - Link to v2: https://urldefense.proofpoint.com/v2/url?u=https-3A__lore.kernel.org_qemu-2Ddevel_20260616-2Dqom-2Dqapi-2Dv2-2D0-2Dcc9396b9c18c-40redhat.com&d=DwIDaQ&c=s883GpUCOChKOHiocYtGcg&r=c23RpsaH4D2MKyD3EPJTDa0BAxz6tV8aUJqVSoytEiY&m=LGtC1Otz03Nx6wZrdIv7LRRcAEAYfhyfKJ4dtNt7PCxy3ILcsWudQol0qR9l2c5a&s=Idir-fKu3uFkuRRHZW8ipF3e84xwMMhnVWVuat0zVXs&e= Changes in v2: - Added kernel-doc documentation for the QAPITypeInfo struct fields. - Dropped "qom: drop free-form property typename registration", it's still needed for array of links to provide useful type names. - Added qdev_prop_link_list for array-of-links properties, with a create function that generates "link<TYPE>List" type names matching the existing "link<TYPE>" convention. - qdev_prop_link now uses &str_type_info instead of "link" (the full "link<TYPE>" type name is set at property-add time) - Simplified DEFINE_PROP_LINK_ARRAY to use qdev_prop_link_list, dropping the now-unnecessary _arraytype parameter. - rebased - Link to v1: https://urldefense.proofpoint.com/v2/url?u=https-3A__lore.kernel.org_qemu-2Ddevel_20260510-2Dqom-2Dqapi-2Dv1-2D0-2D48ba6a1a1fa5-40redhat.com&d=DwIDaQ&c=s883GpUCOChKOHiocYtGcg&r=c23RpsaH4D2MKyD3EPJTDa0BAxz6tV8aUJqVSoytEiY&m=LGtC1Otz03Nx6wZrdIv7LRRcAEAYfhyfKJ4dtNt7PCxy3ILcsWudQol0qR9l2c5a&s=_KgQcnGFWRM8edu2HLa7HFwHHCkp2t6UyriBmPDNk8A&e= To: [email protected] Cc: Markus Armbruster <[email protected]> Cc: Michael Roth <[email protected]> Cc: Pierrick Bouvier <[email protected]> Cc: Paolo Bonzini <[email protected]> Cc: Marc-André Lureau <[email protected]> Cc: "Daniel P. Berrangé" <[email protected]> Cc: Philippe Mathieu-Daudé <[email protected]> --- Marc-André Lureau (74): qapi: add QAPITypeInfo struct definition qapi/gen: fix _module_basename for multi-dash 'what' parameters qapi: factor out QAPISchemaUsedTypes from introspect visitor qapi: register all introspectable types, not just QMP-reachable ones qapi: add type-infos generator meson: add qapi-type-infos-*.c/h to build qom: add qapi_type field to ObjectProperty qapi/qom: add qapi-type field to ObjectPropertyInfo qom/qmp: populate qapi-type in QMP handlers qom: add object_property_set_default_enum() qom: add object_{class_}property_add_qapi qom: add object_{class_}property_add_qapi_enum tests: update check-qom-proplist for QAPI-aware property registration qom: convert enum properties to QAPI-aware registration qom: remove old enum property registration API qom: convert struct properties to QAPI-aware registration x86: convert OnOffAuto properties to QAPI-aware registration microvm: convert OnOffAuto properties to QAPI-aware registration pc: convert OnOffAuto vmport property to QAPI-aware registration arm/virt: convert OnOffAuto acpi property to QAPI-aware registration riscv/virt: convert OnOffAuto properties to QAPI-aware registration loongarch/virt: convert OnOffAuto properties to QAPI-aware registration hostmem-file: convert OnOffAuto rom property to QAPI-aware registration sev: convert OnOffAuto legacy-vm-type property to QAPI-aware registration whpx: convert OnOffAuto hyperv property to QAPI-aware registration whpx: convert OnOffAuto arch properties to QAPI-aware registration accel/kvm: convert OnOffSplit property to QAPI-aware registration whpx: convert OnOffSplit property to QAPI-aware registration ppc/spapr-caps: convert to QAPI-aware property registration system/memory: fix "priority" property typename backends/hostmem: fix property typenames backends/hostmem-file: fix "align" property typename accel/tcg: fix "tb-size" property typename block/throttle-groups: fix throttle properties typename event-loop-base: fix property typenames iothread: fix poll properties typename util/thread-context: fix property typenames target/i386: fix CPUID version properties typename ppc/pnv: fix phb-id and chip-id properties typename backends/hostmem-memfd: fix "hugetlbsize" property typename hw/acpi: fix "node" properties typename net/colo-compare: fix compare_timeout setter visitor type net/colo-compare: fix max_queue_size setter visitor type hw/misc/xlnx-versal-trng: add missing getter for fips-fault-events qom: convert scalar properties to QAPI-aware registration i386/cpu: convert strList property to QAPI-aware registration accel/hvf: convert OnOffSplit property to QAPI-aware registration i386/x86: convert SgxEPCList property to QAPI-aware registration virtio-balloon: convert guest-stats property to QAPI type qom: replace object_property_add_tm with StructTm QAPI type hw/nvdimm: convert UUID property to QAPI-aware registration hw/s390-virtio-ccw: convert loadparm property to QAPI-aware registration hw/ppc/spapr_drc: convert fdt property to QAPI-aware registration spdm-socket: convert SpdmTransportType to QAPI enum hw/gpio/pca955x: use QAPI enums for led and pin properties include: add QEMU_REPEAT helper macro hw/gpio/pca955x: convert pin/led property to QAPI-aware enum hw/pci: change the busnr type to uint8 qdev: add qapi_type field to PropertyInfo with fallback registration qdev: convert core PropertyInfo definitions to use qapi_type qdev: adjust PciDevfn declared type qdev: convert system PropertyInfo definitions to use qapi_type hw: convert device-local PropertyInfo definitions to use qapi_type target/riscv: fix incorrect QAPI types and u8 casting target/riscv: convert PropertyInfo definitions to use qapi_type qdev: convert PropertyInfo definitions to use qapi_type qdev: introduce typed array PropertyInfos qdev: simplify DEFINE_PROP_ARRAY and remove generic array PropertyInfo qdev: remove deprecated PropertyInfo.type and .enum_table fields memory: use object_property_add_link for container property hw/i386: convert PCSouthBridgeOption to QAPI enum qom: use QAPITypeInfo in object_property_get_enum qapi: expose integer signedness and width in introspection tests/qmp-cmd-test: assert qapi-type resolves in query-qmp-schema accel/hvf/hvf-all.c | 29 ++-- accel/kvm/kvm-all.c | 31 ++-- accel/nitro/nitro-accel.c | 3 +- accel/tcg/tcg-all.c | 3 +- accel/whpx/whpx-common.c | 58 +++---- authz/list.c | 14 +- backends/cryptodev.c | 7 +- backends/hostmem-file.c | 33 ++-- backends/hostmem-memfd.c | 3 +- backends/hostmem.c | 20 +-- backends/spdm-socket.c | 25 +-- backends/tpm/tpm_util.c | 3 +- block/throttle-groups.c | 10 +- chardev/char-socket.c | 3 +- crypto/secret_common.c | 12 +- crypto/secret_keyring.c | 9 +- crypto/tlscreds.c | 12 +- docs/devel/qapi-code-gen.rst | 123 +++++++++++++-- docs/interop/virtio-balloon-stats.rst | 22 +-- event-loop-base.c | 7 +- hw/acpi/ich9.c | 3 +- hw/acpi/pci.c | 7 +- hw/arm/virt.c | 31 ++-- hw/block/xen-block.c | 3 +- hw/core/clock.c | 3 +- hw/core/machine-qmp-cmds.c | 3 +- hw/core/machine.c | 13 +- hw/core/qdev-prop-internal.h | 20 +++ hw/core/qdev-properties-system.c | 97 ++++++------ hw/core/qdev-properties.c | 180 ++++++++++++++------- hw/cpu/core.c | 10 +- hw/cxl/cxl-host.c | 6 +- hw/display/apple-gfx-mmio.m | 2 +- hw/display/apple-gfx-pci.m | 2 +- hw/display/apple-gfx.h | 1 + hw/display/apple-gfx.m | 7 +- hw/gpio/aspeed_gpio.c | 5 +- hw/gpio/aspeed_sgpio.c | 3 +- hw/gpio/pca9552.c | 261 ++++++++++++------------------- hw/gpio/pca9554.c | 157 +++++++------------ hw/gpio/stm32l4x5_gpio.c | 5 +- hw/i386/microvm.c | 80 ++++------ hw/i386/pc.c | 32 ++-- hw/i386/pc_piix.c | 61 +++----- hw/i386/sgx-epc.c | 3 +- hw/i386/x86.c | 113 ++++++------- hw/ide/ide-dev.c | 3 +- hw/input/stellaris_gamepad.c | 2 +- hw/intc/apic_common.c | 3 +- hw/intc/arm_gicv3_common.c | 2 +- hw/intc/arm_gicv5_common.c | 4 +- hw/intc/rx_icu.c | 4 +- hw/loongarch/virt.c | 87 +++++------ hw/mem/nvdimm.c | 11 +- hw/mem/pc-dimm.c | 3 +- hw/microblaze/petalogix_s3adsp1800_mmu.c | 19 ++- hw/misc/arm_sysctl.c | 4 +- hw/misc/aspeed_lpc.c | 73 ++++++--- hw/misc/aspeed_sdmc.c | 3 +- hw/misc/mps2-scc.c | 2 +- hw/misc/npcm7xx_mft.c | 3 +- hw/misc/tz-ppc.c | 19 +-- hw/misc/xlnx-versal-trng.c | 15 +- hw/net/ne2000-isa.c | 3 +- hw/net/rocker/rocker.c | 2 +- hw/net/virtio-net.c | 2 +- hw/nvme/ctrl.c | 29 ++-- hw/nvme/nguid.c | 3 +- hw/nvram/xlnx-bbram.c | 3 +- hw/nvram/xlnx-efuse.c | 5 +- hw/nvram/xlnx-versal-efuse-ctrl.c | 2 +- hw/pci-bridge/pci_expander_bridge.c | 3 +- hw/pci-host/i440fx.c | 29 ++-- hw/pci-host/pnv_phb3.c | 5 +- hw/pci-host/pnv_phb4.c | 5 +- hw/pci-host/q35.c | 9 +- hw/pci/pci.c | 3 +- hw/ppc/spapr_caps.c | 39 ++--- hw/ppc/spapr_drc.c | 5 +- hw/ppc/spapr_rtc.c | 18 ++- hw/remote/vfio-user-obj.c | 22 +-- hw/riscv/microchip_pfsoc.c | 3 +- hw/riscv/riscv_hart.c | 6 +- hw/riscv/virt.c | 52 +++--- hw/rtc/mc146818rtc.c | 16 +- hw/s390x/ccw-device.c | 3 +- hw/s390x/css.c | 5 +- hw/s390x/s390-pci-bus.c | 3 +- hw/s390x/s390-virtio-ccw.c | 4 +- hw/s390x/sclpcpi.c | 8 +- hw/s390x/virtio-ccw-mem.c | 3 +- hw/sensor/adc128d818.c | 16 +- hw/sensor/adm1266.c | 3 +- hw/sensor/adm1272.c | 9 +- hw/sensor/emc141x.c | 9 +- hw/sensor/isl_pmbus_vr.c | 19 +-- hw/sensor/lsm303dlhc_mag.c | 9 +- hw/sensor/max34451.c | 5 +- hw/sensor/tmp105.c | 3 +- hw/sensor/tmp421.c | 9 +- hw/usb/dev-storage-classic.c | 3 +- hw/vfio-user/pci.c | 5 +- hw/vfio/pci-quirks.c | 3 +- hw/virtio/virtio-balloon.c | 87 ++++------- hw/virtio/virtio-iommu-pci.c | 2 +- hw/virtio/virtio-mem-pci.c | 3 +- hw/virtio/virtio-mem.c | 18 ++- hw/xen/xen-pvh-common.c | 9 +- include/chardev/char.h | 8 - include/hw/block/block.h | 2 +- include/hw/core/qdev-properties-system.h | 2 + include/hw/core/qdev-properties.h | 40 +++-- include/hw/cxl/cxl_component.h | 5 +- include/hw/i386/pc.h | 4 +- include/qapi/qapi-type-info.h | 32 ++++ include/qemu/osdep.h | 33 ++++ include/qemu/uuid.h | 4 + include/qom/object.h | 171 ++++++++++++-------- include/system/spdm-socket.h | 28 ++-- iothread.c | 9 +- meson.build | 2 + migration/options.c | 4 +- monitor/qmp.c | 12 +- net/colo-compare.c | 15 +- net/dump.c | 6 +- net/filter-buffer.c | 3 +- net/filter.c | 10 +- qapi/common.json | 28 ++++ qapi/introspect.json | 20 ++- qapi/machine.json | 152 ++++++++++++++++++ qapi/meson.build | 4 + qapi/pragma.json | 1 + qapi/qom.json | 10 ++ qapi/sockets.json | 20 +++ qga/meson.build | 2 + qom/object.c | 236 +++++++++++++--------------- qom/qom-qmp-cmds.c | 32 ++-- scripts/qapi/backend.py | 9 +- scripts/qapi/gen.py | 2 +- scripts/qapi/introspect.py | 107 ++++++------- scripts/qapi/schema_analysis.py | 149 ++++++++++++++++++ scripts/qapi/type_infos.py | 178 +++++++++++++++++++++ system/bootdevice.c | 3 +- system/memory.c | 40 +---- target/arm/cpu64.c | 11 +- target/arm/kvm.c | 3 +- target/arm/tcg/cpu64.c | 5 +- target/i386/cpu.c | 26 +-- target/i386/kvm/kvm.c | 38 +++-- target/i386/kvm/tdx.c | 4 +- target/i386/sev.c | 31 ++-- target/i386/whpx/whpx-all.c | 101 ++++-------- target/ppc/compat.c | 3 +- target/riscv/cpu.c | 50 +++--- target/riscv/kvm/kvm-cpu.c | 7 +- target/riscv/tcg/tcg-cpu.c | 13 +- target/s390x/cpu-system.c | 4 +- target/s390x/cpu_models.c | 5 +- target/sparc/cpu.c | 3 +- tests/include/meson.build | 2 + tests/meson.build | 6 + tests/qapi-schema/meson.build | 1 + tests/qtest/qmp-cmd-test.c | 55 ++++++- tests/unit/check-qom-proplist.c | 99 +++++++++--- tests/unit/test-qdev-global-props.c | 11 +- tests/unit/test-qdev.c | 2 +- ui/console-vc.c | 8 +- ui/console.c | 3 +- ui/dbus.c | 18 ++- ui/input-linux.c | 11 +- util/thread-context.c | 7 +- util/uuid.c | 5 + 172 files changed, 2510 insertions(+), 1699 deletions(-) --- base-commit: fa19879df1658f96ac07365fca8835b7decd6995 change-id: 20260510-qom-qapi-fbe0f5060c3f Best regards, -- Marc-André Lureau <[email protected]>
ATB, Mark.
