On Thu, Aug 07, 2025 at 03:48:41PM -0500, Praveen K Paladugu wrote: > From: Praveen K Paladugu <pra...@linux.microsoft.com> > > Probe mshv capabilities from qemu with QMP commands. > > Signed-off-by: Praveen K Paladugu <pra...@linux.microsoft.com> > Signed-off-by: Praveen K Paladugu <praveenkpalad...@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 :|