On Thu, Oct 23, 2025 at 04:27:36PM -0500, Praveen K Paladugu wrote:
> From: Praveen K Paladugu <[email protected]>
>
> qemu recently introduced `query-accelerators` command to generically query the
> list of supported accelerators. Below is an example QMP invocation in qemu:
>
> { "execute": "query-accelerators"}
> {"return": {"enabled": "kvm", "present": ["kvm", "mshv", "qtest", "tcg",
> "xen"]}}
>
> "enabled" here indicates "kvm" is enabled and present.
>
> If query-accelerators command is available, use it. If not, fallback to
> existing query-kvm command.
>
> Signed-off-by: Praveen K Paladugu <[email protected]>
> ---
> src/qemu/qemu_capabilities.c | 35 +-
> src/qemu/qemu_capabilities.h | 1 +
> src/qemu/qemu_monitor.c | 12 +
> src/qemu/qemu_monitor.h | 5 +
> src/qemu/qemu_monitor_json.c | 35 +
> src/qemu/qemu_monitor_json.h | 6 +
> .../qemu_10.1.50-q35.x86_64.xml | 1795 +
> .../qemu_10.1.50-tcg.x86_64.xml | 1827 +
> tests/domaincapsdata/qemu_10.1.50.x86_64.xml | 1795 +
> .../caps_10.1.50_x86_64.replies | 46770 ++++++++++++++++
> .../caps_10.1.50_x86_64.xml | 4950 ++
> 11 files changed, 57228 insertions(+), 3 deletions(-)
> create mode 100644 tests/domaincapsdata/qemu_10.1.50-q35.x86_64.xml
> create mode 100644 tests/domaincapsdata/qemu_10.1.50-tcg.x86_64.xml
> create mode 100644 tests/domaincapsdata/qemu_10.1.50.x86_64.xml
> create mode 100644 tests/qemucapabilitiesdata/caps_10.1.50_x86_64.replies
> create mode 100644 tests/qemucapabilitiesdata/caps_10.1.50_x86_64.xml
>
> diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
> index 83946123be..98d2270d94 100644
> --- a/src/qemu/qemu_capabilities.c
> +++ b/src/qemu/qemu_capabilities.c
> @@ -746,6 +746,7 @@ VIR_ENUM_IMPL(virQEMUCaps,
>
> /* 485 */
> "acpi-generic-initiator", /* QEMU_CAPS_ACPI_GENERIC_INITIATOR
> */
> + "query-accelerators", /* QEMU_CAPS_QUERY_ACCELERATORS */
> );
>
>
> @@ -1261,6 +1262,7 @@ struct virQEMUCapsStringFlags virQEMUCapsCommands[] = {
> { "display-reload", QEMU_CAPS_DISPLAY_RELOAD },
> { "blockdev-set-active", QEMU_CAPS_BLOCKDEV_SET_ACTIVE },
> { "qom-list-get", QEMU_CAPS_QOM_LIST_GET },
> + { "query-accelerators", QEMU_CAPS_QUERY_ACCELERATORS },
> };
>
> struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = {
> @@ -3460,6 +3462,28 @@ virQEMUCapsProbeQMPKVMState(virQEMUCaps *qemuCaps,
> return 0;
> }
>
> +static int
> +virQEMUCapsProbeAccels(virQEMUCaps *qemuCaps,
> + qemuMonitor *mon)
> +{
> + g_autofree char *enabled = NULL;
> + g_auto(GStrv) present = NULL;
> +
> + if (qemuMonitorGetAccelerators(mon, &enabled, &present) < 0)
> + return -1;
> +
> + if (!enabled) {
> + return 0;
> + }
> +
> + if (STREQ(enabled, "tcg"))
> + virQEMUCapsSet(qemuCaps, QEMU_CAPS_TCG);
> + else if (STREQ(enabled, "kvm"))
> + virQEMUCapsSet(qemuCaps, QEMU_CAPS_KVM);
.... "hvf" ....
> +
> + return 0;
> +}
> +
> #ifdef __APPLE__
> bool
> virQEMUCapsProbeHVF(virQEMUCaps *qemuCaps)
> @@ -5777,9 +5801,14 @@ virQEMUCapsInitQMPMonitor(virQEMUCaps *qemuCaps,
> if (virQEMUCapsProbeQMPSchemaCapabilities(qemuCaps, mon) < 0)
> return -1;
>
> - /* Some capabilities may differ depending on KVM state */
> - if (virQEMUCapsProbeQMPKVMState(qemuCaps, mon) < 0)
> - return -1;
> + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_ACCELERATORS)) {
> + if (virQEMUCapsProbeAccels(qemuCaps, mon) < 0)
> + return -1;
> + } else {
> + /* Some capabilities may differ depending on KVM state */
> + if (virQEMUCapsProbeQMPKVMState(qemuCaps, mon) < 0)
> + return -1;
> + }
>
> if (virQEMUCapsProbeHVF(qemuCaps))
> virQEMUCapsSet(qemuCaps, QEMU_CAPS_HVF);
This should be folded into the } else { branch above. We previously
had to query the OS directly, but now we can ask QEMU itself, which
is better as we can now guarantee that QEMU actually has HVF support
built.
With regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|