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);
+
+ 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);