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.


Reply via email to