[PATCH 2/4] qemu: probe mshv capabilities

Praveen K Paladugu posted 4 patches 1 month ago
There is a newer version of this series
[PATCH 2/4] qemu: probe mshv capabilities
Posted by Praveen K Paladugu 1 month ago
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
Re: [PATCH 2/4] qemu: probe mshv capabilities
Posted by Daniel P. Berrangé via Devel 2 weeks, 4 days ago
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 :|