[libvirt] [PATCHv1 4/7] qemu_capabilities: Baseline CPUModel via QEMU

Jiri Denemark jdenemar at redhat.com
Thu May 17 20:38:01 UTC 2018


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




More information about the libvir-list mailing list