On 10/29/2025 6:19 AM, Daniel P. Berrangé wrote:
On Thu, Oct 23, 2025 at 04:27:36PM -0500, Praveen K Paladugu wrote:
From: Praveen K Paladugu <prapal@linux.microsoft.com>
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 <prapal@linux.microsoft.com> --- 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.
Thanks for the review Daniel. I addressed this feedback and pushed a v2 for this patch.
With regards, Daniel
-- Regards, Praveen K Paladugu