From bc74a9da7d6b5c747655468022fdcdd9f9f5f25d Mon Sep 17 00:00:00 2001 Message-Id: From: Jiri Denemark Date: Fri, 7 Feb 2020 10:41:41 +0100 Subject: [PATCH] qemu: Fix hyperv features with QEMU 4.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Originally the names of the hyperv CPU features were only used internally for looking up their CPUID bits. So we used "__kvm_hv_" prefix for them to make sure the names do not collide with normal CPU features stored in our CPU map. But with QEMU 4.1 we check which features were enabled or disabled by a freshly started QEMU process using their names rather than their CPUID bits (mostly because of MSR features). Thus we need to change our made up internal names into the actual names used by QEMU. Most of the names are only used with QEMU 4.1 and newer and the reset was introduced with QEMU recently enough to already support spelling with "-". Thus we don't need to define them as "hv_*" with a translation to "hv-*" for new QEMU. Without this patch libvirt would mistakenly report all hyperv features as unavailable and refuse to start any domain using them with QEMU 4.1. Reported-by: Vitaly Kuznetsov Signed-off-by: Jiri Denemark Tested-by: Vitaly Kuznetsov Reviewed-by: Ján Tomko (cherry picked from commit 0ccdd476bb329f1486438b896255e5c44a91ff4a) https://bugzilla.redhat.com/show_bug.cgi?id=1794868 Conflicts: src/cpu/cpu_x86_data.h - a few extra features were added upstream between 4.5.0 and 5.5.0 - downstream lacks #pragma once and thus all defines have to be indented Signed-off-by: Jiri Denemark Message-Id: <8e882b79ff88eccdb68ede1c5afd4550fcd554b6.1581064395.git.jdenemar@redhat.com> Reviewed-by: Ján Tomko --- src/cpu/cpu_x86_data.h | 24 ++++++++++++------------ src/qemu/qemu_process.c | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/cpu/cpu_x86_data.h b/src/cpu/cpu_x86_data.h index 454345b688..77797f633c 100644 --- a/src/cpu/cpu_x86_data.h +++ b/src/cpu/cpu_x86_data.h @@ -62,19 +62,19 @@ struct _virCPUx86MSR { /* * The following HyperV feature names suffixes must exactly match corresponding * ones defined for virDomainHyperv in domain_conf.c. - * E.g "__kvm_runtime" -> "runtime", "__kvm_hv_spinlocks" -> "spinlocks" etc. + * E.g "hv-runtime" -> "runtime", "hv-spinlocks" -> "spinlocks" etc. */ -# define VIR_CPU_x86_KVM_HV_RUNTIME "__kvm_hv_runtime" -# define VIR_CPU_x86_KVM_HV_SYNIC "__kvm_hv_synic" -# define VIR_CPU_x86_KVM_HV_STIMER "__kvm_hv_stimer" -# define VIR_CPU_x86_KVM_HV_RELAXED "__kvm_hv_relaxed" -# define VIR_CPU_x86_KVM_HV_SPINLOCKS "__kvm_hv_spinlocks" -# define VIR_CPU_x86_KVM_HV_VAPIC "__kvm_hv_vapic" -# define VIR_CPU_x86_KVM_HV_VPINDEX "__kvm_hv_vpindex" -# define VIR_CPU_x86_KVM_HV_RESET "__kvm_hv_reset" -# define VIR_CPU_x86_KVM_HV_FREQUENCIES "__kvm_hv_frequencies" -# define VIR_CPU_x86_KVM_HV_REENLIGHTENMENT "__kvm_hv_reenlightenment" -# define VIR_CPU_x86_KVM_HV_TLBFLUSH "__kvm_hv_tlbflush" +# define VIR_CPU_x86_KVM_HV_RUNTIME "hv-runtime" +# define VIR_CPU_x86_KVM_HV_SYNIC "hv-synic" +# define VIR_CPU_x86_KVM_HV_STIMER "hv-stimer" +# define VIR_CPU_x86_KVM_HV_RELAXED "hv-relaxed" +# define VIR_CPU_x86_KVM_HV_SPINLOCKS "hv-spinlocks" +# define VIR_CPU_x86_KVM_HV_VAPIC "hv-vapic" +# define VIR_CPU_x86_KVM_HV_VPINDEX "hv-vpindex" +# define VIR_CPU_x86_KVM_HV_RESET "hv-reset" +# define VIR_CPU_x86_KVM_HV_FREQUENCIES "hv-frequencies" +# define VIR_CPU_x86_KVM_HV_REENLIGHTENMENT "hv-reenlightenment" +# define VIR_CPU_x86_KVM_HV_TLBFLUSH "hv-tlbflush" # define VIR_CPU_X86_DATA_INIT { 0 } diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 0700b054f3..312ce69ba5 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -3923,7 +3923,7 @@ qemuProcessVerifyHypervFeatures(virDomainDefPtr def, if (def->hyperv_features[i] != VIR_TRISTATE_SWITCH_ON) continue; - if (virAsprintf(&cpuFeature, "__kvm_hv_%s", + if (virAsprintf(&cpuFeature, "hv-%s", virDomainHypervTypeToString(i)) < 0) return -1; -- 2.25.0