51d9a2
From af7f65d5ce4fe129b0844eb031212a3fb397b8da Mon Sep 17 00:00:00 2001
51d9a2
Message-Id: <af7f65d5ce4fe129b0844eb031212a3fb397b8da@dist-git>
7a3408
From: Jiri Denemark <jdenemar@redhat.com>
7a3408
Date: Fri, 27 Mar 2015 12:48:40 +0100
7a3408
Subject: [PATCH] RHEL: Hack around changed Broadwell/Haswell CPUs
7a3408
7a3408
RHEL-only
7a3408
7a3408
Upstream tried to solve the change of Broadwell and Haswell CPUs by
7a3408
removing rtm and hle features from the corresponding CPU models for new
7a3408
machine types. Then they reverted this and introduced new *-noTSX models
7a3408
instead. However, the original fix was backported to RHEL.
7a3408
3e5111
This patch makes sure Broadwell and Haswell will always contain rtm and
7a3408
hle features regardless on RHEL version or machine type used.
7a3408
7a3408
https://bugzilla.redhat.com/show_bug.cgi?id=1199446
7a3408
7a3408
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
7a3408
---
51d9a2
 src/qemu/qemu_command.c                       | 29 +++++++++++++++++++
51d9a2
 tests/qemuxml2argvdata/cpu-Haswell.args       |  2 +-
51d9a2
 .../qemuxml2argvdata/cpu-host-model-cmt.args  |  3 +-
51d9a2
 tests/qemuxml2argvdata/cpu-tsc-frequency.args |  2 +-
51d9a2
 tests/qemuxml2argvdata/q35-acpi-nouefi.args   |  2 +-
51d9a2
 tests/qemuxml2argvdata/q35-acpi-uefi.args     |  2 +-
51d9a2
 tests/qemuxml2argvdata/q35-noacpi-nouefi.args |  2 +-
404507
 7 files changed, 36 insertions(+), 6 deletions(-)
7a3408
7a3408
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
51d9a2
index 4fc3176ad3..c1eefca639 100644
7a3408
--- a/src/qemu/qemu_command.c
7a3408
+++ b/src/qemu/qemu_command.c
51d9a2
@@ -6677,6 +6677,8 @@ qemuBuildCpuModelArgStr(virQEMUDriverPtr driver,
3e5111
     size_t i;
7a3408
     virCapsPtr caps = NULL;
3e5111
     virCPUDefPtr cpu = def->cpu;
7a3408
+    bool hle = false;
7a3408
+    bool rtm = false;
7a3408
 
3e5111
     if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
3e5111
         goto cleanup;
51d9a2
@@ -6734,6 +6736,11 @@ qemuBuildCpuModelArgStr(virQEMUDriverPtr driver,
3e5111
         virBufferAsprintf(buf, ",vendor=%s", cpu->vendor_id);
3e5111
 
3e5111
     for (i = 0; i < cpu->nfeatures; i++) {
3e5111
+        if (STREQ("rtm", cpu->features[i].name))
3e5111
+            rtm = true;
3e5111
+        if (STREQ("hle", cpu->features[i].name))
3e5111
+            hle = true;
7a3408
+
3e5111
         switch ((virCPUFeaturePolicy) cpu->features[i].policy) {
3e5111
         case VIR_CPU_FEATURE_FORCE:
3e5111
         case VIR_CPU_FEATURE_REQUIRE:
51d9a2
@@ -6757,6 +6764,28 @@ qemuBuildCpuModelArgStr(virQEMUDriverPtr driver,
7a3408
         }
7a3408
     }
7a3408
 
3e5111
+    /* Some versions of qemu-kvm in RHEL provide Broadwell and Haswell CPU
3e5111
+     * models which lack rtm and hle features when used with some machine
3e5111
+     * types. Let's make sure Broadwell and Haswell will always have these
3e5111
+     * features. But only if the features were not explicitly mentioned in
3e5111
+     * the guest CPU definition.
3e5111
+     */
3e5111
+    if (STREQ_NULLABLE(cpu->model, "Broadwell") ||
3e5111
+        STREQ_NULLABLE(cpu->model, "Haswell")) {
404507
+        if (!rtm) {
404507
+            if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION))
404507
+                virBufferAddLit(buf, ",rtm=on");
404507
+            else
404507
+                virBufferAddLit(buf, ",+rtm");
404507
+        }
404507
+        if (!hle) {
404507
+            if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION))
404507
+                virBufferAddLit(buf, ",hle=on");
404507
+            else
404507
+                virBufferAddLit(buf, ",+hle");
404507
+        }
3e5111
+    }
3e5111
+
7a3408
     ret = 0;
3e5111
  cleanup:
3e5111
     virObjectUnref(caps);
51d9a2
diff --git a/tests/qemuxml2argvdata/cpu-Haswell.args b/tests/qemuxml2argvdata/cpu-Haswell.args
51d9a2
index c7ce396d05..6f20359524 100644
51d9a2
--- a/tests/qemuxml2argvdata/cpu-Haswell.args
51d9a2
+++ b/tests/qemuxml2argvdata/cpu-Haswell.args
6ae9ed
@@ -8,7 +8,7 @@ QEMU_AUDIO_DRV=none \
6ae9ed
 -name QEMUGuest1 \
6ae9ed
 -S \
51d9a2
 -machine pc,accel=kvm,usb=off,dump-guest-core=off \
6ae9ed
--cpu Haswell \
6ae9ed
+-cpu Haswell,+rtm,+hle \
6ae9ed
 -m 214 \
3e5111
 -smp 6,sockets=6,cores=1,threads=1 \
6ae9ed
 -uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
51d9a2
diff --git a/tests/qemuxml2argvdata/cpu-host-model-cmt.args b/tests/qemuxml2argvdata/cpu-host-model-cmt.args
51d9a2
index 8767278d11..d236aa9e09 100644
51d9a2
--- a/tests/qemuxml2argvdata/cpu-host-model-cmt.args
51d9a2
+++ b/tests/qemuxml2argvdata/cpu-host-model-cmt.args
3e5111
@@ -9,7 +9,8 @@ QEMU_AUDIO_DRV=none \
6ae9ed
 -S \
51d9a2
 -machine pc,accel=tcg,usb=off,dump-guest-core=off \
3e5111
 -cpu Haswell,+vme,+ds,+acpi,+ss,+ht,+tm,+pbe,+dtes64,+monitor,+ds_cpl,+vmx,\
3e5111
-+smx,+est,+tm2,+xtpr,+pdcm,+osxsave,+f16c,+rdrand,+pdpe1gb,+abm,+lahf_lm \
3e5111
++smx,+est,+tm2,+xtpr,+pdcm,+osxsave,+f16c,+rdrand,+pdpe1gb,+abm,+lahf_lm,+rtm,\
3e5111
++hle \
3e5111
 -m 214 \
3e5111
 -smp 6,sockets=6,cores=1,threads=1 \
3e5111
 -uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
51d9a2
diff --git a/tests/qemuxml2argvdata/cpu-tsc-frequency.args b/tests/qemuxml2argvdata/cpu-tsc-frequency.args
51d9a2
index 7824dea96f..216fd43014 100644
51d9a2
--- a/tests/qemuxml2argvdata/cpu-tsc-frequency.args
51d9a2
+++ b/tests/qemuxml2argvdata/cpu-tsc-frequency.args
3e5111
@@ -10,7 +10,7 @@ QEMU_AUDIO_DRV=none \
51d9a2
 -machine pc,accel=kvm,usb=off,dump-guest-core=off \
3e5111
 -cpu Haswell,+vme,+ds,+acpi,+ss,+ht,+tm,+pbe,+dtes64,+monitor,+ds_cpl,+vmx,\
3e5111
 +smx,+est,+tm2,+xtpr,+pdcm,+osxsave,+f16c,+rdrand,+pdpe1gb,+abm,+lahf_lm,\
3e5111
-+invtsc,tsc-frequency=3504000000 \
3e5111
++invtsc,+rtm,+hle,tsc-frequency=3504000000 \
6ae9ed
 -m 214 \
3e5111
 -smp 1,sockets=1,cores=1,threads=1 \
6ae9ed
 -uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
51d9a2
diff --git a/tests/qemuxml2argvdata/q35-acpi-nouefi.args b/tests/qemuxml2argvdata/q35-acpi-nouefi.args
51d9a2
index caef49ea16..a9375a35db 100644
51d9a2
--- a/tests/qemuxml2argvdata/q35-acpi-nouefi.args
51d9a2
+++ b/tests/qemuxml2argvdata/q35-acpi-nouefi.args
404507
@@ -8,7 +8,7 @@ QEMU_AUDIO_DRV=none \
404507
 -name guest \
404507
 -S \
51d9a2
 -machine q35,accel=tcg,usb=off,dump-guest-core=off \
404507
--cpu Haswell \
404507
+-cpu Haswell,+rtm,+hle \
404507
 -m 1024 \
404507
 -smp 1,sockets=1,cores=1,threads=1 \
404507
 -uuid 496d7ea8-9739-544b-4ebd-ef08be936e8b \
51d9a2
diff --git a/tests/qemuxml2argvdata/q35-acpi-uefi.args b/tests/qemuxml2argvdata/q35-acpi-uefi.args
51d9a2
index a3293aeb9d..8e3368b9e9 100644
51d9a2
--- a/tests/qemuxml2argvdata/q35-acpi-uefi.args
51d9a2
+++ b/tests/qemuxml2argvdata/q35-acpi-uefi.args
404507
@@ -8,7 +8,7 @@ QEMU_AUDIO_DRV=none \
404507
 -name guest \
404507
 -S \
51d9a2
 -machine q35,accel=tcg,usb=off,dump-guest-core=off \
404507
--cpu Haswell \
404507
+-cpu Haswell,+rtm,+hle \
404507
 -drive file=/usr/share/OVMF/OVMF_CODE.fd,if=pflash,format=raw,unit=0,\
404507
 readonly=on \
404507
 -drive file=/var/lib/libvirt/qemu/nvram/guest_VARS.fd,if=pflash,format=raw,\
51d9a2
diff --git a/tests/qemuxml2argvdata/q35-noacpi-nouefi.args b/tests/qemuxml2argvdata/q35-noacpi-nouefi.args
51d9a2
index fab2a6fcb0..0dd61840ef 100644
51d9a2
--- a/tests/qemuxml2argvdata/q35-noacpi-nouefi.args
51d9a2
+++ b/tests/qemuxml2argvdata/q35-noacpi-nouefi.args
404507
@@ -8,7 +8,7 @@ QEMU_AUDIO_DRV=none \
404507
 -name guest \
404507
 -S \
51d9a2
 -machine q35,accel=tcg,usb=off,dump-guest-core=off \
404507
--cpu Haswell \
404507
+-cpu Haswell,+rtm,+hle \
404507
 -m 1024 \
404507
 -smp 1,sockets=1,cores=1,threads=1 \
404507
 -uuid 496d7ea8-9739-544b-4ebd-ef08be936e8b \
7a3408
-- 
51d9a2
2.18.0
7a3408