Hiya, here's some draft output of a script I'm working on to summarize QMP wire format differences between QEMU versions.
This script works in terms of the QMP *wire format*, not the QAPI *specification*. As a consequence, *almost* all type names are stripped from this output and all nested structures are fully inlined - so changes to shared data structures, enums, etc will manifest as many independent changes. Similarly, changes to type names and type factorings that do not change the wire format will not appear in this report at all. This is still a WIP: if conditionals and features may not be fully represented in this summary report. Here's today's diff output, see if you think this format is "intuitive" or makes sense to some extent; or, if you're feeling bored, if you believe it's fully accurate: jsnow@scv ~/s/qemu (master)> qapi-schema-diff qapi-compiled-v9.0.0.json qapi-compiled-v9.0.0-1388-g80e8f060216.json ################################### v9.0.0 ==> v9.0.0-1388-g80e8f060216 ################################### ******** commands ******** Removed ======= x-query-rdma Modified ======== blockdev-backup (arguments) ++ arguments.discard-source: Optional<boolean> drive-backup (arguments) ++ arguments.discard-source: Optional<boolean> migrate (arguments) -- arguments.blk: Optional<boolean> -- arguments.inc: Optional<boolean> migrate-incoming (arguments) ++ arguments.exit-on-error: Optional<boolean> migrate-set-capabilities (arguments) ·· arguments.capabilities[].capability: enum -- 'block' -- 'compress' migrate-set-parameters (arguments) -- arguments.block-incremental: Optional<boolean> -- arguments.compress-level: Optional<integer> -- arguments.compress-threads: Optional<integer> -- arguments.compress-wait-thread: Optional<boolean> -- arguments.decompress-threads: Optional<integer> object-add (arguments) ·· arguments.qom-type: enum ++ 'sev-snp-guest' ++ arguments<qom-type=sev-guest>.legacy-vm-type: Optional<boolean> ++ arguments<qom-type=sev-snp-guest>.author-key-enabled: Optional<boolean> ++ arguments<qom-type=sev-snp-guest>.cbitpos: Optional<integer> ++ arguments<qom-type=sev-snp-guest>.guest-visible-workarounds: Optional<string> ++ arguments<qom-type=sev-snp-guest>.host-data: Optional<string> ++ arguments<qom-type=sev-snp-guest>.id-auth: Optional<string> ++ arguments<qom-type=sev-snp-guest>.id-block: Optional<string> ++ arguments<qom-type=sev-snp-guest>.kernel-hashes: Optional<boolean> ++ arguments<qom-type=sev-snp-guest>.policy: Optional<integer> ++ arguments<qom-type=sev-snp-guest>.reduced-phys-bits: integer ++ arguments<qom-type=sev-snp-guest>.sev-device: Optional<string> ++ arguments<qom-type=sev-snp-guest>.vcek-disabled: Optional<boolean> query-cpu-model-baseline (returns, arguments) ++ arguments.modela.deprecated-props: Optional<array> ++ arguments.modela.deprecated-props[]: string ++ arguments.modelb.deprecated-props: Optional<array> ++ arguments.modelb.deprecated-props[]: string ++ returns.model.deprecated-props: Optional<array> ++ returns.model.deprecated-props[]: string query-cpu-model-comparison (arguments) ++ arguments.modela.deprecated-props: Optional<array> ++ arguments.modela.deprecated-props[]: string ++ arguments.modelb.deprecated-props: Optional<array> ++ arguments.modelb.deprecated-props[]: string query-cpu-model-expansion (returns, arguments) ++ arguments.model.deprecated-props: Optional<array> ++ arguments.model.deprecated-props[]: string ++ returns.model.deprecated-props: Optional<array> ++ returns.model.deprecated-props[]: string query-cpus-fast (returns) ++ returns[].props.module-id: Optional<integer> ·· returns[].target: enum -- 'nios2' query-hotpluggable-cpus (returns) ++ returns[].props.module-id: Optional<integer> query-machines (returns, arguments) ++ arguments.compat-props: Optional<boolean> ++ returns[].compat-props: Optional<array> ++ returns[].compat-props[]: object ++ returns[].compat-props[].property: string ++ returns[].compat-props[].qom-type: string ++ returns[].compat-props[].value: string query-migrate (returns) -- returns.compression: Optional<object> -- returns.compression.busy: integer -- returns.compression.busy-rate: number -- returns.compression.compressed-size: integer -- returns.compression.compression-rate: number -- returns.compression.pages: integer -- returns.disk: Optional<object> -- returns.disk.dirty-pages-rate: integer -- returns.disk.dirty-sync-count: integer -- returns.disk.dirty-sync-missed-zero-copy: integer -- returns.disk.downtime-bytes: integer -- returns.disk.duplicate: integer -- returns.disk.mbps: number -- returns.disk.multifd-bytes: integer -- returns.disk.normal: integer -- returns.disk.normal-bytes: integer -- returns.disk.page-size: integer -- returns.disk.pages-per-second: integer -- returns.disk.postcopy-bytes: integer -- returns.disk.postcopy-requests: integer -- returns.disk.precopy-bytes: integer -- returns.disk.remaining: integer -- returns.disk.skipped: integer -- returns.disk.total: integer -- returns.disk.transferred: integer -- returns.ram.skipped: integer query-migrate-capabilities (returns) ·· returns[].capability: enum -- 'block' -- 'compress' query-migrate-parameters (returns) -- returns.block-incremental: Optional<boolean> -- returns.compress-level: Optional<integer> -- returns.compress-threads: Optional<integer> -- returns.compress-wait-thread: Optional<boolean> -- returns.decompress-threads: Optional<integer> query-sev (returns) -- returns.handle: integer -- returns.policy: integer ++ returns.sev-type: enum ++ returns<sev-type=sev-snp>.snp-policy: integer ++ returns<sev-type=sev>.handle: integer ++ returns<sev-type=sev>.policy: integer query-target (returns) ·· returns.arch: enum -- 'nios2' set-numa-node (arguments) ++ arguments<type=cpu>.module-id: Optional<integer> trace-event-get-state (returns, arguments) -- arguments.vcpu: Optional<integer> -- returns[].vcpu: boolean trace-event-set-state (arguments) -- arguments.vcpu: Optional<integer> transaction (arguments) ++ arguments.actions[]<type=blockdev-backup>.data.discard-source: Optional<boolean> ++ arguments.actions[]<type=drive-backup>.data.discard-source: Optional<boolean> ****** events ****** Added ===== VFIO_MIGRATION Removed ======= MEM_UNPLUG_ERROR RDMA_GID_STATUS_CHANGED