[libvirt] [PATCH] qemu: cpu: fix fullCPU to include all emulatable qemu features

Nikolay Shirokovskiy nshirokovskiy at virtuozzo.com
Tue Feb 13 06:46:33 UTC 2018


ping

On 20.11.2017 15:55, Nikolay Shirokovskiy wrote:
> On Core i5 650 guest fail to start with error [1] if guest cpu config is taken
> from domcapabilities and check is set to partial.
> 
> The problem is in qemu caps fullCPU calculation in virQEMUCapsInitHostCPUModel.
> It is supposed to include features emulated by qemu and missed on host. Some of
> such features may be not included however.
> 
> For mentioned cpu host cpu is detected as Westmere and guest cpu as
> SandyBridge. x2apic is missed on host and provided by installed qemu. The
> feature is not mentioned in guest cpu features explicitly because SandyBridge
> model include it. As a result fullCPU does not include x2apic too.
> 
> Solution is to expand guest cpu features before updating fullCPU features.
> 
> [1] error: the CPU is incompatible with host CPU: Host CPU does not
>     provide required features: x2apic, tsc-deadline
> ---
>  src/qemu/qemu_capabilities.c | 12 +++++++++---
>  1 file changed, 9 insertions(+), 3 deletions(-)
> 
> diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
> index 9c1eeac..edba716 100644
> --- a/src/qemu/qemu_capabilities.c
> +++ b/src/qemu/qemu_capabilities.c
> @@ -3475,6 +3475,7 @@ virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps,
>                              virDomainVirtType type)
>  {
>      virCPUDefPtr cpu = NULL;
> +    virCPUDefPtr cpuExpanded = NULL;
>      virCPUDefPtr migCPU = NULL;
>      virCPUDefPtr hostCPU = NULL;
>      virCPUDefPtr fullCPU = NULL;
> @@ -3504,9 +3505,13 @@ virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps,
>                                        NULL, NULL)))
>              goto error;
>  
> -        for (i = 0; i < cpu->nfeatures; i++) {
> -            if (cpu->features[i].policy == VIR_CPU_FEATURE_REQUIRE &&
> -                virCPUDefUpdateFeature(fullCPU, cpu->features[i].name,
> +        if (!(cpuExpanded = virCPUDefCopy(cpu)) ||
> +            virCPUExpandFeatures(qemuCaps->arch, cpuExpanded) < 0)
> +            goto error;
> +
> +        for (i = 0; i < cpuExpanded->nfeatures; i++) {
> +            if (cpuExpanded->features[i].policy == VIR_CPU_FEATURE_REQUIRE &&
> +                virCPUDefUpdateFeature(fullCPU, cpuExpanded->features[i].name,
>                                         VIR_CPU_FEATURE_REQUIRE) < 0)
>                  goto error;
>          }
> @@ -3528,6 +3533,7 @@ virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps,
>      virQEMUCapsSetHostModel(qemuCaps, type, cpu, migCPU, fullCPU);
>  
>   cleanup:
> +    virCPUDefFree(cpuExpanded);
>      virCPUDefFree(hostCPU);
>      return;
>  
> 




More information about the libvir-list mailing list