1b5f1d
From 1d93a3944a200b7c955800faa598e0e11da098f8 Mon Sep 17 00:00:00 2001
1b5f1d
Message-Id: <1d93a3944a200b7c955800faa598e0e11da098f8@dist-git>
d76c62
From: Jiri Denemark <jdenemar@redhat.com>
d76c62
Date: Fri, 27 Mar 2015 12:48:40 +0100
d76c62
Subject: [PATCH] RHEL: Hack around changed Broadwell/Haswell CPUs
d76c62
d76c62
RHEL-only
d76c62
d76c62
Upstream tried to solve the change of Broadwell and Haswell CPUs by
d76c62
removing rtm and hle features from the corresponding CPU models for new
d76c62
machine types. Then they reverted this and introduced new *-noTSX models
d76c62
instead. However, the original fix was backported to RHEL.
d76c62
d76c62
This patch makes sure Broadwell and Haswell will always contain rtm and
d76c62
hle features regardless on RHEL version or machine type used.
d76c62
d76c62
https://bugzilla.redhat.com/show_bug.cgi?id=1199446
d76c62
d76c62
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
d76c62
---
76f597
 src/qemu/qemu_command.c                       | 22 +++++++++++++++++++
d76c62
 tests/qemuxml2argvdata/cpu-Haswell.args       |  2 +-
d76c62
 .../qemuxml2argvdata/cpu-host-model-cmt.args  |  2 +-
9de337
 .../cpu-translation.x86_64-4.0.0.args         |  2 +-
9de337
 .../cpu-translation.x86_64-latest.args        |  2 +-
9de337
 tests/qemuxml2argvdata/cpu-tsc-frequency.args |  2 +-
d76c62
 tests/qemuxml2argvdata/q35-acpi-nouefi.args   |  2 +-
d76c62
 tests/qemuxml2argvdata/q35-acpi-uefi.args     |  2 +-
d76c62
 tests/qemuxml2argvdata/q35-noacpi-nouefi.args |  2 +-
76f597
 9 files changed, 30 insertions(+), 8 deletions(-)
d76c62
d76c62
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
1b5f1d
index d822533ccb..6b4647a711 100644
d76c62
--- a/src/qemu/qemu_command.c
d76c62
+++ b/src/qemu/qemu_command.c
1b5f1d
@@ -6521,6 +6521,8 @@ qemuBuildCpuModelArgStr(virQEMUDriver *driver,
d76c62
 {
d76c62
     size_t i;
9de337
     virCPUDef *cpu = def->cpu;
d76c62
+    bool hle = false;
d76c62
+    bool rtm = false;
d76c62
 
d76c62
     switch ((virCPUMode) cpu->mode) {
d76c62
     case VIR_CPU_MODE_HOST_PASSTHROUGH:
1b5f1d
@@ -6587,6 +6589,12 @@ qemuBuildCpuModelArgStr(virQEMUDriver *driver,
d76c62
     for (i = 0; i < cpu->nfeatures; i++) {
76f597
         const char *featname =
76f597
             virQEMUCapsCPUFeatureToQEMU(qemuCaps, cpu->features[i].name);
76f597
+
d76c62
+        if (STREQ("rtm", cpu->features[i].name))
d76c62
+            rtm = true;
d76c62
+        if (STREQ("hle", cpu->features[i].name))
d76c62
+            hle = true;
d76c62
+
d76c62
         switch ((virCPUFeaturePolicy) cpu->features[i].policy) {
d76c62
         case VIR_CPU_FEATURE_FORCE:
d76c62
         case VIR_CPU_FEATURE_REQUIRE:
1b5f1d
@@ -6604,6 +6612,20 @@ qemuBuildCpuModelArgStr(virQEMUDriver *driver,
d76c62
         }
d76c62
     }
d76c62
 
d76c62
+    /* Some versions of qemu-kvm in RHEL provide Broadwell and Haswell CPU
d76c62
+     * models which lack rtm and hle features when used with some machine
d76c62
+     * types. Let's make sure Broadwell and Haswell will always have these
d76c62
+     * features. But only if the features were not explicitly mentioned in
d76c62
+     * the guest CPU definition.
d76c62
+     */
d76c62
+    if (STREQ_NULLABLE(cpu->model, "Broadwell") ||
d76c62
+        STREQ_NULLABLE(cpu->model, "Haswell")) {
d76c62
+        if (!rtm)
76f597
+            virBufferAddLit(buf, ",rtm=on");
d76c62
+        if (!hle)
76f597
+            virBufferAddLit(buf, ",hle=on");
d76c62
+    }
d76c62
+
d76c62
     return 0;
d76c62
 }
d76c62
 
d76c62
diff --git a/tests/qemuxml2argvdata/cpu-Haswell.args b/tests/qemuxml2argvdata/cpu-Haswell.args
1e07ec
index b57fdfddc5..965274c1f0 100644
d76c62
--- a/tests/qemuxml2argvdata/cpu-Haswell.args
d76c62
+++ b/tests/qemuxml2argvdata/cpu-Haswell.args
1e07ec
@@ -13,7 +13,7 @@ QEMU_AUDIO_DRV=none \
aa5bf2
 -object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \
1e07ec
 -machine pc,usb=off,dump-guest-core=off \
1e07ec
 -accel kvm \
d76c62
--cpu Haswell \
76f597
+-cpu Haswell,rtm=on,hle=on \
d76c62
 -m 214 \
d76c62
 -realtime mlock=off \
d76c62
 -smp 6,sockets=6,cores=1,threads=1 \
d76c62
diff --git a/tests/qemuxml2argvdata/cpu-host-model-cmt.args b/tests/qemuxml2argvdata/cpu-host-model-cmt.args
1e07ec
index 0de04e877d..602f70de86 100644
d76c62
--- a/tests/qemuxml2argvdata/cpu-host-model-cmt.args
d76c62
+++ b/tests/qemuxml2argvdata/cpu-host-model-cmt.args
1e07ec
@@ -13,7 +13,7 @@ QEMU_AUDIO_DRV=none \
aa5bf2
 -object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \
1e07ec
 -machine pc,usb=off,dump-guest-core=off \
1e07ec
 -accel tcg \
76f597
--cpu Haswell,vme=on,ds=on,acpi=on,ss=on,ht=on,tm=on,pbe=on,dtes64=on,monitor=on,ds-cpl=on,vmx=on,smx=on,est=on,tm2=on,xtpr=on,pdcm=on,f16c=on,rdrand=on,pdpe1gb=on,abm=on,lahf-lm=on \
76f597
+-cpu Haswell,vme=on,ds=on,acpi=on,ss=on,ht=on,tm=on,pbe=on,dtes64=on,monitor=on,ds-cpl=on,vmx=on,smx=on,est=on,tm2=on,xtpr=on,pdcm=on,f16c=on,rdrand=on,pdpe1gb=on,abm=on,lahf-lm=on,rtm=on,hle=on \
d76c62
 -m 214 \
d76c62
 -realtime mlock=off \
d76c62
 -smp 6,sockets=6,cores=1,threads=1 \
d76c62
diff --git a/tests/qemuxml2argvdata/cpu-translation.x86_64-4.0.0.args b/tests/qemuxml2argvdata/cpu-translation.x86_64-4.0.0.args
1e07ec
index 09141106d5..ace08d5d76 100644
d76c62
--- a/tests/qemuxml2argvdata/cpu-translation.x86_64-4.0.0.args
d76c62
+++ b/tests/qemuxml2argvdata/cpu-translation.x86_64-4.0.0.args
1e07ec
@@ -13,7 +13,7 @@ QEMU_AUDIO_DRV=none \
9de337
 -object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \
1e07ec
 -machine pc-i440fx-4.0,usb=off,dump-guest-core=off \
1e07ec
 -accel tcg \
76f597
--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 \
76f597
+-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,rtm=on,hle=on,kvm-pv-eoi=on,kvm-pv-unhalt=on \
d76c62
 -m 214 \
d76c62
 -overcommit mem-lock=off \
d76c62
 -smp 1,sockets=1,cores=1,threads=1 \
d76c62
diff --git a/tests/qemuxml2argvdata/cpu-translation.x86_64-latest.args b/tests/qemuxml2argvdata/cpu-translation.x86_64-latest.args
1b5f1d
index 2dab572a6b..a9f7c4b910 100644
d76c62
--- a/tests/qemuxml2argvdata/cpu-translation.x86_64-latest.args
d76c62
+++ b/tests/qemuxml2argvdata/cpu-translation.x86_64-latest.args
1e07ec
@@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
9de337
 -object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \
1e07ec
 -machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram \
1e07ec
 -accel tcg \
9de337
--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 \
9de337
+-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,rtm=on,hle=on,kvm-pv-eoi=on,kvm-pv-unhalt=on \
d76c62
 -m 214 \
9de337
 -object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
d76c62
 -overcommit mem-lock=off \
d76c62
diff --git a/tests/qemuxml2argvdata/cpu-tsc-frequency.args b/tests/qemuxml2argvdata/cpu-tsc-frequency.args
1e07ec
index 4a032f5d85..48fb75abcc 100644
d76c62
--- a/tests/qemuxml2argvdata/cpu-tsc-frequency.args
d76c62
+++ b/tests/qemuxml2argvdata/cpu-tsc-frequency.args
1e07ec
@@ -13,7 +13,7 @@ QEMU_AUDIO_DRV=none \
aa5bf2
 -object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \
1e07ec
 -machine pc,usb=off,dump-guest-core=off \
1e07ec
 -accel kvm \
76f597
--cpu Haswell,vme=on,ds=on,acpi=on,ss=on,ht=on,tm=on,pbe=on,dtes64=on,monitor=on,ds-cpl=on,vmx=on,smx=on,est=on,tm2=on,xtpr=on,pdcm=on,f16c=on,rdrand=on,pdpe1gb=on,abm=on,lahf-lm=on,invtsc=on,tsc-frequency=4567890000 \
76f597
+-cpu Haswell,vme=on,ds=on,acpi=on,ss=on,ht=on,tm=on,pbe=on,dtes64=on,monitor=on,ds-cpl=on,vmx=on,smx=on,est=on,tm2=on,xtpr=on,pdcm=on,f16c=on,rdrand=on,pdpe1gb=on,abm=on,lahf-lm=on,invtsc=on,rtm=on,hle=on,tsc-frequency=4567890000 \
d76c62
 -m 214 \
d76c62
 -realtime mlock=off \
d76c62
 -smp 1,sockets=1,cores=1,threads=1 \
d76c62
diff --git a/tests/qemuxml2argvdata/q35-acpi-nouefi.args b/tests/qemuxml2argvdata/q35-acpi-nouefi.args
1e07ec
index 3faee48c77..a1f742712d 100644
d76c62
--- a/tests/qemuxml2argvdata/q35-acpi-nouefi.args
d76c62
+++ b/tests/qemuxml2argvdata/q35-acpi-nouefi.args
1e07ec
@@ -13,7 +13,7 @@ QEMU_AUDIO_DRV=none \
aa5bf2
 -object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-guest/master-key.aes \
1e07ec
 -machine q35,usb=off,dump-guest-core=off \
1e07ec
 -accel tcg \
d76c62
--cpu Haswell \
76f597
+-cpu Haswell,rtm=on,hle=on \
d76c62
 -m 1024 \
d76c62
 -realtime mlock=off \
d76c62
 -smp 1,sockets=1,cores=1,threads=1 \
d76c62
diff --git a/tests/qemuxml2argvdata/q35-acpi-uefi.args b/tests/qemuxml2argvdata/q35-acpi-uefi.args
1e07ec
index 60da1e282a..620056223a 100644
d76c62
--- a/tests/qemuxml2argvdata/q35-acpi-uefi.args
d76c62
+++ b/tests/qemuxml2argvdata/q35-acpi-uefi.args
1e07ec
@@ -13,7 +13,7 @@ QEMU_AUDIO_DRV=none \
aa5bf2
 -object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-guest/master-key.aes \
1e07ec
 -machine q35,usb=off,dump-guest-core=off \
1e07ec
 -accel tcg \
d76c62
--cpu Haswell \
76f597
+-cpu Haswell,rtm=on,hle=on \
9de337
 -drive file=/usr/share/OVMF/OVMF_CODE.fd,if=pflash,format=raw,unit=0,readonly=on \
9de337
 -drive file=/var/lib/libvirt/qemu/nvram/guest_VARS.fd,if=pflash,format=raw,unit=1 \
9de337
 -m 1024 \
d76c62
diff --git a/tests/qemuxml2argvdata/q35-noacpi-nouefi.args b/tests/qemuxml2argvdata/q35-noacpi-nouefi.args
1e07ec
index 14e5bbc22a..ea66536c2a 100644
d76c62
--- a/tests/qemuxml2argvdata/q35-noacpi-nouefi.args
d76c62
+++ b/tests/qemuxml2argvdata/q35-noacpi-nouefi.args
1e07ec
@@ -13,7 +13,7 @@ QEMU_AUDIO_DRV=none \
aa5bf2
 -object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-guest/master-key.aes \
1e07ec
 -machine q35,usb=off,dump-guest-core=off \
1e07ec
 -accel tcg \
d76c62
--cpu Haswell \
76f597
+-cpu Haswell,rtm=on,hle=on \
d76c62
 -m 1024 \
d76c62
 -realtime mlock=off \
d76c62
 -smp 1,sockets=1,cores=1,threads=1 \
d76c62
-- 
1e07ec
2.34.1
d76c62