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