| From 0dd015e1aff1a56a4584824d1a97c9eacabf7f03 Mon Sep 17 00:00:00 2001 |
| Message-Id: <0dd015e1aff1a56a4584824d1a97c9eacabf7f03@dist-git> |
| From: Jiri Denemark <jdenemar@redhat.com> |
| 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 <jdenemar@redhat.com> |
| |
| 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 |
| |
| |
| @@ -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 |
| |
| |
| @@ -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 |
| |
| |
| @@ -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 |
| |
| |
| @@ -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 |
| |
| |
| @@ -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 |
| |
| |
| @@ -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 |
| |
| |
| @@ -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 |
| |
| |
| @@ -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 |
| |
| |
| @@ -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 |
| |