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