[PATCH v1 1/2] qemu: driver: use model name "host" for mode "host-passthrough"

Jiri Denemark jdenemar at redhat.com
Thu Sep 24 07:02:50 UTC 2020


On Wed, Sep 23, 2020 at 22:26:28 -0400, Collin Walling wrote:
> When executing the hypervisor-cpu-compare/baseline commands and
> the XML file contains a CPU definition using host-passthrough
> and no model name, the commands will fail and return an error
> message from the QMP response.

That's the expected and correct behavior, only the error message is
should be better and reported directly by libvirt.

> Let's fix this by checking for host-passthrough and a missing
> model name after the CPU definition has been converted from
> XML. If these conditions are matched, then the CPU definition's
> model name will be set to "host".
> 
> Signed-off-by: Collin Walling <walling at linux.ibm.com>
> ---
>  src/qemu/qemu_driver.c | 41 +++++++++++++++++++++++++++++++----------
>  1 file changed, 31 insertions(+), 10 deletions(-)
> 
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 1cecef01f7..427d2419f3 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -12281,6 +12281,26 @@ qemuConnectCPUModelComparison(virQEMUCapsPtr qemuCaps,
>  }
>  
>  
> +static int
> +qemuConnectCheckCPUModel(virCPUDefPtr cpu)
> +{
> +    if (!cpu->model) {
> +        /*
> +         * On some architectures a model name is never present
> +         * for the host-passthrough mode, so default it to "host"
> +         */
> +        if (cpu->mode == VIR_CPU_MODE_HOST_PASSTHROUGH) {
> +            cpu->model = g_strdup("host");
> +        } else {
> +            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                           _("cpu parameter is missing a model name"));
> +            return -1;
> +        }
> +    }
> +    return 0;
> +}
> +
> +
>  static int
>  qemuConnectCompareHypervisorCPU(virConnectPtr conn,
>                                  const char *emulator,
...
> @@ -12470,10 +12484,17 @@ qemuConnectCPUModelBaseline(virQEMUCapsPtr qemuCaps,
>      if (VIR_ALLOC(baseline) < 0)
>          return NULL;
>  
> -    if (virCPUDefCopyModel(baseline, cpus[0], false))
> +    if (qemuConnectCheckCPUModel(cpus[0]) < 0)
> +        return NULL;
> +
> +    if (virCPUDefCopyModel(baseline, cpus[0], false) < 0)
>          return NULL;
>  
>      for (i = 1; i < ncpus; i++) {
> +
> +        if (qemuConnectCheckCPUModel(cpus[i]) < 0)
> +            return NULL;
> +
>          if (qemuMonitorGetCPUModelBaseline(proc->mon, baseline,
>                                             cpus[i], &result) < 0)
>              return NULL;

As explained in the "qemu: substitute missing model name for
host-passthrough" thread, we should only make sure all CPUs passed to
the baseline API have a non-empty <model> element.

Jirka




More information about the libvir-list mailing list