From 0dd015e1aff1a56a4584824d1a97c9eacabf7f03 Mon Sep 17 00:00:00 2001 Message-Id: <0dd015e1aff1a56a4584824d1a97c9eacabf7f03@dist-git> From: Jiri Denemark Date: Fri, 27 Mar 2015 12:48:40 +0100 Subject: [PATCH] RHEL: Hack around changed Broadwell/Haswell CPUs RHEL-only Upstream tried to solve the change of Broadwell and Haswell CPUs by removing rtm and hle features from the corresponding CPU models for new machine types. Then they reverted this and introduced new *-noTSX models instead. However, the original fix was backported to RHEL. This patch makes sure Broadwell and Haswell will always contain rtm and hle features regardless on RHEL version or machine type used. https://bugzilla.redhat.com/show_bug.cgi?id=1199446 Signed-off-by: Jiri Denemark --- src/qemu/qemu_command.c | 21 +++++++++++++++++++ tests/qemuxml2argvdata/cpu-Haswell.args | 2 +- .../qemuxml2argvdata/cpu-host-model-cmt.args | 2 +- .../cpu-translation.x86_64-4.0.0.args | 4 ++-- .../cpu-translation.x86_64-latest.args | 4 ++-- tests/qemuxml2argvdata/cpu-tsc-frequency.args | 4 ++-- tests/qemuxml2argvdata/q35-acpi-nouefi.args | 2 +- tests/qemuxml2argvdata/q35-acpi-uefi.args | 2 +- tests/qemuxml2argvdata/q35-noacpi-nouefi.args | 2 +- 9 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 904d2beab5..e10cc7fc74 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -6469,6 +6469,8 @@ qemuBuildCpuModelArgStr(virQEMUDriverPtr driver, { size_t i; virCPUDefPtr cpu = def->cpu; + bool hle = false; + bool rtm = false; switch ((virCPUMode) cpu->mode) { case VIR_CPU_MODE_HOST_PASSTHROUGH: @@ -6524,6 +6526,11 @@ qemuBuildCpuModelArgStr(virQEMUDriverPtr driver, virBufferAsprintf(buf, ",vendor=%s", cpu->vendor_id); for (i = 0; i < cpu->nfeatures; i++) { + if (STREQ("rtm", cpu->features[i].name)) + rtm = true; + if (STREQ("hle", cpu->features[i].name)) + hle = true; + switch ((virCPUFeaturePolicy) cpu->features[i].policy) { case VIR_CPU_FEATURE_FORCE: case VIR_CPU_FEATURE_REQUIRE: @@ -6541,6 +6548,20 @@ qemuBuildCpuModelArgStr(virQEMUDriverPtr driver, } } + /* Some versions of qemu-kvm in RHEL provide Broadwell and Haswell CPU + * models which lack rtm and hle features when used with some machine + * types. Let's make sure Broadwell and Haswell will always have these + * features. But only if the features were not explicitly mentioned in + * the guest CPU definition. + */ + if (STREQ_NULLABLE(cpu->model, "Broadwell") || + STREQ_NULLABLE(cpu->model, "Haswell")) { + if (!rtm) + qemuBuildCpuFeature(qemuCaps, buf, "rtm", true); + if (!hle) + qemuBuildCpuFeature(qemuCaps, buf, "hle", true); + } + return 0; } diff --git a/tests/qemuxml2argvdata/cpu-Haswell.args b/tests/qemuxml2argvdata/cpu-Haswell.args index a33b16f7ce..d35de5ea58 100644 --- a/tests/qemuxml2argvdata/cpu-Haswell.args +++ b/tests/qemuxml2argvdata/cpu-Haswell.args @@ -11,7 +11,7 @@ QEMU_AUDIO_DRV=none \ -name QEMUGuest1 \ -S \ -machine pc,accel=kvm,usb=off,dump-guest-core=off \ --cpu Haswell \ +-cpu Haswell,+rtm,+hle \ -m 214 \ -realtime mlock=off \ -smp 6,sockets=6,cores=1,threads=1 \ diff --git a/tests/qemuxml2argvdata/cpu-host-model-cmt.args b/tests/qemuxml2argvdata/cpu-host-model-cmt.args index 42f969fd62..c8795acb3e 100644 --- a/tests/qemuxml2argvdata/cpu-host-model-cmt.args +++ b/tests/qemuxml2argvdata/cpu-host-model-cmt.args @@ -12,7 +12,7 @@ QEMU_AUDIO_DRV=none \ -S \ -machine pc,accel=tcg,usb=off,dump-guest-core=off \ -cpu Haswell,+vme,+ds,+acpi,+ss,+ht,+tm,+pbe,+dtes64,+monitor,+ds_cpl,+vmx,\ -+smx,+est,+tm2,+xtpr,+pdcm,+f16c,+rdrand,+pdpe1gb,+abm,+lahf_lm \ ++smx,+est,+tm2,+xtpr,+pdcm,+f16c,+rdrand,+pdpe1gb,+abm,+lahf_lm,+rtm,+hle \ -m 214 \ -realtime mlock=off \ -smp 6,sockets=6,cores=1,threads=1 \ diff --git a/tests/qemuxml2argvdata/cpu-translation.x86_64-4.0.0.args b/tests/qemuxml2argvdata/cpu-translation.x86_64-4.0.0.args index f8e19fca24..08c672fd2c 100644 --- a/tests/qemuxml2argvdata/cpu-translation.x86_64-4.0.0.args +++ b/tests/qemuxml2argvdata/cpu-translation.x86_64-4.0.0.args @@ -14,8 +14,8 @@ QEMU_AUDIO_DRV=none \ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ -machine pc-i440fx-4.0,accel=tcg,usb=off,dump-guest-core=off \ -cpu Haswell,pclmuldq=on,ds_cpl=on,tsc_adjust=on,fxsr_opt=on,lahf_lm=on,\ -cmp_legacy=on,nodeid_msr=on,perfctr_core=on,perfctr_nb=on,kvm_pv_eoi=on,\ -kvm_pv_unhalt=on \ +cmp_legacy=on,nodeid_msr=on,perfctr_core=on,perfctr_nb=on,rtm=on,hle=on,\ +kvm_pv_eoi=on,kvm_pv_unhalt=on \ -m 214 \ -overcommit mem-lock=off \ -smp 1,sockets=1,cores=1,threads=1 \ diff --git a/tests/qemuxml2argvdata/cpu-translation.x86_64-latest.args b/tests/qemuxml2argvdata/cpu-translation.x86_64-latest.args index 9322b826f4..1dbfc9553b 100644 --- a/tests/qemuxml2argvdata/cpu-translation.x86_64-latest.args +++ b/tests/qemuxml2argvdata/cpu-translation.x86_64-latest.args @@ -14,8 +14,8 @@ QEMU_AUDIO_DRV=none \ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ -machine pc,accel=tcg,usb=off,dump-guest-core=off \ -cpu Haswell,pclmulqdq=on,ds-cpl=on,tsc-adjust=on,fxsr-opt=on,lahf-lm=on,\ -cmp-legacy=on,nodeid-msr=on,perfctr-core=on,perfctr-nb=on,kvm-pv-eoi=on,\ -kvm-pv-unhalt=on \ +cmp-legacy=on,nodeid-msr=on,perfctr-core=on,perfctr-nb=on,rtm=on,hle=on,\ +kvm-pv-eoi=on,kvm-pv-unhalt=on \ -m 214 \ -overcommit mem-lock=off \ -smp 1,sockets=1,cores=1,threads=1 \ diff --git a/tests/qemuxml2argvdata/cpu-tsc-frequency.args b/tests/qemuxml2argvdata/cpu-tsc-frequency.args index 55b72b4404..45a777d468 100644 --- a/tests/qemuxml2argvdata/cpu-tsc-frequency.args +++ b/tests/qemuxml2argvdata/cpu-tsc-frequency.args @@ -12,8 +12,8 @@ QEMU_AUDIO_DRV=none \ -S \ -machine pc,accel=kvm,usb=off,dump-guest-core=off \ -cpu Haswell,+vme,+ds,+acpi,+ss,+ht,+tm,+pbe,+dtes64,+monitor,+ds_cpl,+vmx,\ -+smx,+est,+tm2,+xtpr,+pdcm,+f16c,+rdrand,+pdpe1gb,+abm,+lahf_lm,+invtsc,\ -tsc-frequency=3504000000 \ ++smx,+est,+tm2,+xtpr,+pdcm,+f16c,+rdrand,+pdpe1gb,+abm,+lahf_lm,+invtsc,+rtm,\ ++hle,tsc-frequency=3504000000 \ -m 214 \ -realtime mlock=off \ -smp 1,sockets=1,cores=1,threads=1 \ diff --git a/tests/qemuxml2argvdata/q35-acpi-nouefi.args b/tests/qemuxml2argvdata/q35-acpi-nouefi.args index 09e06c96ea..aed56fb1fc 100644 --- a/tests/qemuxml2argvdata/q35-acpi-nouefi.args +++ b/tests/qemuxml2argvdata/q35-acpi-nouefi.args @@ -11,7 +11,7 @@ QEMU_AUDIO_DRV=none \ -name guest \ -S \ -machine q35,accel=tcg,usb=off,dump-guest-core=off \ --cpu Haswell \ +-cpu Haswell,+rtm,+hle \ -m 1024 \ -realtime mlock=off \ -smp 1,sockets=1,cores=1,threads=1 \ diff --git a/tests/qemuxml2argvdata/q35-acpi-uefi.args b/tests/qemuxml2argvdata/q35-acpi-uefi.args index d00fe5bc1d..1f4bfe7f87 100644 --- a/tests/qemuxml2argvdata/q35-acpi-uefi.args +++ b/tests/qemuxml2argvdata/q35-acpi-uefi.args @@ -11,7 +11,7 @@ QEMU_AUDIO_DRV=none \ -name guest \ -S \ -machine q35,accel=tcg,usb=off,dump-guest-core=off \ --cpu Haswell \ +-cpu Haswell,+rtm,+hle \ -drive file=/usr/share/OVMF/OVMF_CODE.fd,if=pflash,format=raw,unit=0,\ readonly=on \ -drive file=/var/lib/libvirt/qemu/nvram/guest_VARS.fd,if=pflash,format=raw,\ diff --git a/tests/qemuxml2argvdata/q35-noacpi-nouefi.args b/tests/qemuxml2argvdata/q35-noacpi-nouefi.args index de34dff1cf..ccea7f91f9 100644 --- a/tests/qemuxml2argvdata/q35-noacpi-nouefi.args +++ b/tests/qemuxml2argvdata/q35-noacpi-nouefi.args @@ -11,7 +11,7 @@ QEMU_AUDIO_DRV=none \ -name guest \ -S \ -machine q35,accel=tcg,usb=off,dump-guest-core=off \ --cpu Haswell \ +-cpu Haswell,+rtm,+hle \ -m 1024 \ -realtime mlock=off \ -smp 1,sockets=1,cores=1,threads=1 \ -- 2.25.0