On Sat, May 05, 2018 at 12:48:46 -0500, Chris Venteicher wrote:
Spinup QEMU instance and complete QMP query-cpu-model-baseline
exchanges
to determine CPUModel Baseline.
query-cpu-model-baseline only compares two CPUModels so multiple
exchanges are needed to evaluate more than two CPUModels.
---
src/qemu/qemu_capabilities.c | 132 +++++++++++++++++++++++++++++++++++++++++++
src/qemu/qemu_capabilities.h | 9 +++
2 files changed, 141 insertions(+)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 097985cbe7..9ffbf91a90 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -5122,3 +5122,135 @@ virQEMUCapsSetMicrocodeVersion(virQEMUCapsPtr qemuCaps,
{
qemuCaps->microcodeVersion = microcodeVersion;
}
+
+
+/* in:
+ * <host>
+ * <cpu>
+ * <arch>s390x</arch>
+ * <model>z13-base</model>
+ * <feature name='xxx'/>
+ * ...
+ * <feature name='yyy'/>
+ * </cpu>
+ * <cpu>
+ * <arch>s390x</arch>
+ * <model>z114-base</model>
+ * <feature name='xxx'/>
+ * ...
+ * <feature name='yyy'/>
+ * </cpu>
+ * </host>
+ *
+ * out:
+ * <cpu match='exact'>
+ * <model>z13-base</model>
+ * <feature policy='require' name='xxx'/>
+ * <feature policy='require' name='yyy'/>
+ * </cpu>
+ *
+ * (ret==0) && (baseline.len == 0) if baseline not supported by QEMU
+ */
+int
+virQEMUCapsQMPBaselineCPUModel(char *exec,
+ const char *libDir,
+ uid_t runUid,
+ gid_t runGid,
+ const char **xmlCPUs,
+ unsigned int ncpus,
+ bool migratable,
+ virBufferPtr baseline)
+{
+ qemuMonitorCPUModelInfoPtr model_baseline = NULL;
+ qemuMonitorCPUModelInfoPtr new_model_baseline = NULL;
+ qemuMonitorCPUModelInfoPtr model_b = NULL;
+ virQEMUCapsInitQMPCommandPtr cmd = NULL;
+ virBuffer buf = VIR_BUFFER_INITIALIZER;
+ bool forceTCG = false;
+ int ret = -1;
+ size_t i;
+
+ VIR_DEBUG("ncpus=%i, migratable=%i", ncpus, migratable);
+
+ if (!(cmd = virQEMUCapsSpinUpQemu(exec, libDir, runUid, runGid, forceTCG)))
+ goto cleanup;
+
+ if (!(cmd->mon)) {
This test will never be true.
+ /* Not connected to QEMU (monitor) */
+ VIR_DEBUG("QEMU failed to initialize error=%s",
virGetLastErrorMessage());
+ goto cleanup;
+ }
+
+ /* QEMU requires qmp_capabilities exchange first */
+ if (qemuMonitorSetCapabilities(cmd->mon) < 0) {
+ VIR_DEBUG("Failed to set monitor capabilities %s",
+ virGetLastErrorMessage());
+ goto cleanup;
+ }
This should be moved inside virQEMUCapsSpinUpQemu.
And the rest of the function needs to be changed to work on CPUDefs
already parsed by the caller.
Jirka