From: Praveen K Paladugu <prapal@linux.microsoft.com>
Probe mshv capabilities from qemu with QMP commands.
Signed-off-by: Praveen K Paladugu <prapal@linux.microsoft.com>
Signed-off-by: Praveen K Paladugu <praveenkpaladugu@gmail.com>
---
src/qemu/qemu_capabilities.c | 31 ++++++++++++++++++++++++-------
src/qemu/qemu_monitor.c | 9 +++++----
src/qemu/qemu_monitor.h | 8 +++++---
src/qemu/qemu_monitor_json.c | 13 +++++++------
src/qemu/qemu_monitor_json.h | 10 +++++-----
5 files changed, 46 insertions(+), 25 deletions(-)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 1e069eb0e5..02dbae8e00 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -3473,17 +3473,31 @@ virQEMUCapsProbeQMPTPM(virQEMUCaps *qemuCaps,
static int
-virQEMUCapsProbeQMPKVMState(virQEMUCaps *qemuCaps,
- qemuMonitor *mon)
+virQEMUCapsProbeQMPHypervisorState(virQEMUCaps *qemuCaps,
+ qemuMonitor *mon,
+ virQEMUCapsFlags flag)
{
bool enabled = false;
bool present = false;
- if (qemuMonitorGetKVMState(mon, &enabled, &present) < 0)
- return -1;
+ if (flag == QEMU_CAPS_KVM) {
+ if (qemuMonitorGetHypervisorState(mon, "query-kvm",
+ &enabled, &present) < 0)
+ return -1;
+ if (present && enabled)
+ virQEMUCapsSet(qemuCaps, QEMU_CAPS_KVM);
+ } else if (flag == QEMU_CAPS_MSHV) {
- if (present && enabled)
- virQEMUCapsSet(qemuCaps, QEMU_CAPS_KVM);
+ if (qemuMonitorGetHypervisorState(mon, "query-mshv",
+ &enabled, &present) < 0)
+ return -1;
+ if (present && enabled)
+ virQEMUCapsSet(qemuCaps, QEMU_CAPS_MSHV);
+ } else {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Invalid Hypervisor type specified for qemu"));
+ return -1;
+ }
return 0;
}
@@ -5792,7 +5806,10 @@ virQEMUCapsInitQMPMonitor(virQEMUCaps *qemuCaps,
return -1;
/* Some capabilities may differ depending on KVM state */
- if (virQEMUCapsProbeQMPKVMState(qemuCaps, mon) < 0)
+ if (virQEMUCapsProbeQMPHypervisorState(qemuCaps, mon, QEMU_CAPS_KVM) < 0)
+ return -1;
+
+ if (virQEMUCapsProbeQMPHypervisorState(qemuCaps, mon, QEMU_CAPS_MSHV) < 0)
return -1;
if (virQEMUCapsProbeHVF(qemuCaps))
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index c1fef8d5de..3d01844074 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -3423,15 +3423,16 @@ qemuMonitorGetCommandLineOptions(qemuMonitor *mon)
int
-qemuMonitorGetKVMState(qemuMonitor *mon,
- bool *enabled,
- bool *present)
+qemuMonitorGetHypervisorState(qemuMonitor *mon,
+ const char *query_cmd,
+ bool *enabled,
+ bool *present)
{
VIR_DEBUG("enabled=%p present=%p", enabled, present);
QEMU_CHECK_MONITOR(mon);
- return qemuMonitorJSONGetKVMState(mon, enabled, present);
+ return qemuMonitorJSONGetHypervisorState(mon, query_cmd, enabled, present);
}
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
index 755f347e17..8bb0919a00 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -1220,9 +1220,11 @@ qemuMonitorCPUModelInfoCopy(const qemuMonitorCPUModelInfo *orig);
GHashTable *qemuMonitorGetCommandLineOptions(qemuMonitor *mon);
-int qemuMonitorGetKVMState(qemuMonitor *mon,
- bool *enabled,
- bool *present);
+int
+qemuMonitorGetHypervisorState(qemuMonitor *mon,
+ const char *query_cmd,
+ bool *enabled,
+ bool *present);
int qemuMonitorGetObjectTypes(qemuMonitor *mon,
char ***types);
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index 9f51421478..18ca124e46 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -5520,9 +5520,10 @@ qemuMonitorJSONGetCommandLineOptions(qemuMonitor *mon)
}
-int qemuMonitorJSONGetKVMState(qemuMonitor *mon,
- bool *enabled,
- bool *present)
+int qemuMonitorJSONGetHypervisorState(qemuMonitor *mon,
+ const char *query_cmd,
+ bool *enabled,
+ bool *present)
{
g_autoptr(virJSONValue) cmd = NULL;
g_autoptr(virJSONValue) reply = NULL;
@@ -5531,7 +5532,7 @@ int qemuMonitorJSONGetKVMState(qemuMonitor *mon,
/* Safe defaults */
*enabled = *present = false;
- if (!(cmd = qemuMonitorJSONMakeCommand("query-kvm", NULL)))
+ if (!(cmd = qemuMonitorJSONMakeCommand(query_cmd, NULL)))
return -1;
if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0)
@@ -5542,8 +5543,8 @@ int qemuMonitorJSONGetKVMState(qemuMonitor *mon,
if (virJSONValueObjectGetBoolean(data, "enabled", enabled) < 0 ||
virJSONValueObjectGetBoolean(data, "present", present) < 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("query-kvm replied unexpected data"));
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("%1$s replied unexpected data"), query_cmd);
return -1;
}
diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h
index bd437f7938..2de17e3d75 100644
--- a/src/qemu/qemu_monitor_json.h
+++ b/src/qemu/qemu_monitor_json.h
@@ -451,11 +451,11 @@ qemuMonitorJSONGetCPUModelComparison(qemuMonitor *mon,
GHashTable *
qemuMonitorJSONGetCommandLineOptions(qemuMonitor *mon);
-int
-qemuMonitorJSONGetKVMState(qemuMonitor *mon,
- bool *enabled,
- bool *present)
- ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
+int qemuMonitorJSONGetHypervisorState(qemuMonitor *mon,
+ const char *query_cmd,
+ bool *enabled,
+ bool *present)
+ ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4);
int
qemuMonitorJSONGetObjectTypes(qemuMonitor *mon,
--
2.50.1
On Thu, Aug 07, 2025 at 03:48:41PM -0500, Praveen K Paladugu wrote:
> From: Praveen K Paladugu <prapal@linux.microsoft.com>
>
> Probe mshv capabilities from qemu with QMP commands.
>
> Signed-off-by: Praveen K Paladugu <prapal@linux.microsoft.com>
> Signed-off-by: Praveen K Paladugu <praveenkpaladugu@gmail.com>
> ---
> src/qemu/qemu_capabilities.c | 31 ++++++++++++++++++++++++-------
> src/qemu/qemu_monitor.c | 9 +++++----
> src/qemu/qemu_monitor.h | 8 +++++---
> src/qemu/qemu_monitor_json.c | 13 +++++++------
> src/qemu/qemu_monitor_json.h | 10 +++++-----
> 5 files changed, 46 insertions(+), 25 deletions(-)
>
> diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
> index 1e069eb0e5..02dbae8e00 100644
> --- a/src/qemu/qemu_capabilities.c
> +++ b/src/qemu/qemu_capabilities.c
> @@ -3473,17 +3473,31 @@ virQEMUCapsProbeQMPTPM(virQEMUCaps *qemuCaps,
>
>
> static int
> -virQEMUCapsProbeQMPKVMState(virQEMUCaps *qemuCaps,
> - qemuMonitor *mon)
> +virQEMUCapsProbeQMPHypervisorState(virQEMUCaps *qemuCaps,
> + qemuMonitor *mon,
> + virQEMUCapsFlags flag)
> {
> bool enabled = false;
> bool present = false;
>
> - if (qemuMonitorGetKVMState(mon, &enabled, &present) < 0)
> - return -1;
> + if (flag == QEMU_CAPS_KVM) {
> + if (qemuMonitorGetHypervisorState(mon, "query-kvm",
> + &enabled, &present) < 0)
> + return -1;
> + if (present && enabled)
> + virQEMUCapsSet(qemuCaps, QEMU_CAPS_KVM);
> + } else if (flag == QEMU_CAPS_MSHV) {
>
> - if (present && enabled)
> - virQEMUCapsSet(qemuCaps, QEMU_CAPS_KVM);
> + if (qemuMonitorGetHypervisorState(mon, "query-mshv",
> + &enabled, &present) < 0)
> + return -1;
> + if (present && enabled)
> + virQEMUCapsSet(qemuCaps, QEMU_CAPS_MSHV);
> + } else {
> + virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> + _("Invalid Hypervisor type specified for qemu"));
> + return -1;
> + }
>
> return 0;
> }
> @@ -5792,7 +5806,10 @@ virQEMUCapsInitQMPMonitor(virQEMUCaps *qemuCaps,
> return -1;
>
> /* Some capabilities may differ depending on KVM state */
> - if (virQEMUCapsProbeQMPKVMState(qemuCaps, mon) < 0)
> + if (virQEMUCapsProbeQMPHypervisorState(qemuCaps, mon, QEMU_CAPS_KVM) < 0)
> + return -1;
> +
> + if (virQEMUCapsProbeQMPHypervisorState(qemuCaps, mon, QEMU_CAPS_MSHV) < 0)
> return -1;
>
> if (virQEMUCapsProbeHVF(qemuCaps))
> diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
> index c1fef8d5de..3d01844074 100644
> --- a/src/qemu/qemu_monitor.c
> +++ b/src/qemu/qemu_monitor.c
> @@ -3423,15 +3423,16 @@ qemuMonitorGetCommandLineOptions(qemuMonitor *mon)
>
>
> int
> -qemuMonitorGetKVMState(qemuMonitor *mon,
> - bool *enabled,
> - bool *present)
> +qemuMonitorGetHypervisorState(qemuMonitor *mon,
> + const char *query_cmd,
> + bool *enabled,
> + bool *present)
> {
> VIR_DEBUG("enabled=%p present=%p", enabled, present);
>
> QEMU_CHECK_MONITOR(mon);
>
> - return qemuMonitorJSONGetKVMState(mon, enabled, present);
> + return qemuMonitorJSONGetHypervisorState(mon, query_cmd, enabled, present);
> }
>
>
> diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
> index 755f347e17..8bb0919a00 100644
> --- a/src/qemu/qemu_monitor.h
> +++ b/src/qemu/qemu_monitor.h
> @@ -1220,9 +1220,11 @@ qemuMonitorCPUModelInfoCopy(const qemuMonitorCPUModelInfo *orig);
>
> GHashTable *qemuMonitorGetCommandLineOptions(qemuMonitor *mon);
>
> -int qemuMonitorGetKVMState(qemuMonitor *mon,
> - bool *enabled,
> - bool *present);
> +int
> +qemuMonitorGetHypervisorState(qemuMonitor *mon,
> + const char *query_cmd,
> + bool *enabled,
> + bool *present);
>
> int qemuMonitorGetObjectTypes(qemuMonitor *mon,
> char ***types);
> diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
> index 9f51421478..18ca124e46 100644
> --- a/src/qemu/qemu_monitor_json.c
> +++ b/src/qemu/qemu_monitor_json.c
> @@ -5520,9 +5520,10 @@ qemuMonitorJSONGetCommandLineOptions(qemuMonitor *mon)
> }
>
>
> -int qemuMonitorJSONGetKVMState(qemuMonitor *mon,
> - bool *enabled,
> - bool *present)
> +int qemuMonitorJSONGetHypervisorState(qemuMonitor *mon,
> + const char *query_cmd,
> + bool *enabled,
> + bool *present)
> {
> g_autoptr(virJSONValue) cmd = NULL;
> g_autoptr(virJSONValue) reply = NULL;
> @@ -5531,7 +5532,7 @@ int qemuMonitorJSONGetKVMState(qemuMonitor *mon,
> /* Safe defaults */
> *enabled = *present = false;
>
> - if (!(cmd = qemuMonitorJSONMakeCommand("query-kvm", NULL)))
> + if (!(cmd = qemuMonitorJSONMakeCommand(query_cmd, NULL)))
> return -1;
>
> if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0)
> @@ -5542,8 +5543,8 @@ int qemuMonitorJSONGetKVMState(qemuMonitor *mon,
>
> if (virJSONValueObjectGetBoolean(data, "enabled", enabled) < 0 ||
> virJSONValueObjectGetBoolean(data, "present", present) < 0) {
> - virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> - _("query-kvm replied unexpected data"));
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("%1$s replied unexpected data"), query_cmd);
> return -1;
> }
>
> diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h
> index bd437f7938..2de17e3d75 100644
> --- a/src/qemu/qemu_monitor_json.h
> +++ b/src/qemu/qemu_monitor_json.h
> @@ -451,11 +451,11 @@ qemuMonitorJSONGetCPUModelComparison(qemuMonitor *mon,
> GHashTable *
> qemuMonitorJSONGetCommandLineOptions(qemuMonitor *mon);
>
> -int
> -qemuMonitorJSONGetKVMState(qemuMonitor *mon,
> - bool *enabled,
> - bool *present)
> - ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
> +int qemuMonitorJSONGetHypervisorState(qemuMonitor *mon,
> + const char *query_cmd,
> + bool *enabled,
> + bool *present)
> + ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4);
We don't really want QMP command names to leak into callers. I'd suggest
making this an internal helper function with qemuMonitorJSONGetKVMState
& qemuMonitorJSONGetMSHVState being thin wrappers that specify the
command name, and similar qemuMonitorGetKVMState & qemuMonitorGetMSHVState
wrappers in qemu_monitor.h
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 :|
© 2016 - 2026 Red Hat, Inc.