[libvirt] [PATCH] qemu: ensure "pc" machine is always used as default if available

Eduardo Habkost ehabkost at redhat.com
Fri Aug 3 16:05:49 UTC 2018


On Fri, Aug 03, 2018 at 01:59:47PM +0100, Daniel P. Berrangé wrote:
> It is increasingly likely that some distro is going to change the
> default "x86" machine type in QEMU from "pc" to "q35". This will
> certainly break existing applications which write their XML on the
> assumption that its using a "pc" machine by default. For example they'll
> lack a IDE CDROM and get PCI-X instad of PCI which changes the topology
> radically.
> 
> Libvirt promises to isolate applications from hypervisor changes that
> may cause incompatibilities, so we must ensure that we always use the
> "pc" machine type if it is available. Only use QEMU's own reported
> default machine type if "pc" does not exist.
> 
> Note this change assumes there will always be a "pc" alias as long as a
> versioned "pc-XXX" machine type exists. If QEMU were to ship a "pc-XXX"
> machine type but not provide the "pc" alias, it is too hard to decide
> which to default so. Versioned machine types are supposed to be
> considered opaque strings, so we can't apply any sensible ordering
> ourselves and QEMU isn't reporting the list of machines in any sensible
> ordering itself.
> 
> Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>

Won't this break qemuParseCommandLine() if it sees a QEMU binary
running without "-machine"?  It will assume the QEMU default is
"pc" but this may be not true.


> ---
>  src/qemu/qemu_capabilities.c | 19 +++++++++++++++++--
>  1 file changed, 17 insertions(+), 2 deletions(-)
> 
> diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
> index 0fb800589a..9eb58afef3 100644
> --- a/src/qemu/qemu_capabilities.c
> +++ b/src/qemu/qemu_capabilities.c
> @@ -2242,6 +2242,17 @@ virQEMUCapsProbeQMPMachineTypes(virQEMUCapsPtr qemuCaps,
>      int ret = -1;
>      size_t i;
>      size_t defIdx = 0;
> +    ssize_t preferredIdx = -1;
> +    const char *preferredAlias = NULL;
> +
> +    /* Historically QEMU defaulted to 'pc' machine type but in
> +     * future might switch 'q35'. Such a change is considered
> +     * an ABI break from lbivirt's POV, so we must be sure to
> +     * keep 'pc' as default machine no matter what QEMU says.
> +     */
> +    if (qemuCaps->arch == VIR_ARCH_X86_64 ||
> +        qemuCaps->arch == VIR_ARCH_I686)
> +        preferredAlias = "pc";
>  
>      if ((nmachines = qemuMonitorGetMachines(mon, &machines)) < 0)
>          return -1;
> @@ -2263,12 +2274,16 @@ virQEMUCapsProbeQMPMachineTypes(virQEMUCapsPtr qemuCaps,
>          mach->maxCpus = machines[i]->maxCpus;
>          mach->hotplugCpus = machines[i]->hotplugCpus;
>  
> +        if (STREQ_NULLABLE(mach->alias, preferredAlias))
> +            preferredIdx = qemuCaps->nmachineTypes - 1;
> +

Isn't STREQ_NULLABLE(NULL, NULL) true?  You don't want to set
preferredIdx here if preferredAlias==NULL.

>          if (machines[i]->isDefault)
>              defIdx = qemuCaps->nmachineTypes - 1;
>      }
>  
> -    if (defIdx)
> -        virQEMUCapsSetDefaultMachine(qemuCaps, defIdx);
> +    if (preferredIdx == -1)
> +        preferredIdx = defIdx;
> +    virQEMUCapsSetDefaultMachine(qemuCaps, preferredIdx);
>  
>      ret = 0;
>  
> -- 
> 2.17.1

-- 
Eduardo




More information about the libvir-list mailing list