c1c534
From 01e432517f0a44054a5317cea7f8a1171a3b10c7 Mon Sep 17 00:00:00 2001
c1c534
Message-Id: <01e432517f0a44054a5317cea7f8a1171a3b10c7@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
---
c1c534
 src/qemu/qemu_command.c                            | 29 ++++++++++++++++++++++
c1c534
 .../qemuxml2argvdata/qemuxml2argv-cpu-Haswell.args |  2 +-
c1c534
 .../qemuxml2argv-cpu-host-model-cmt.args           |  3 ++-
c1c534
 .../qemuxml2argv-cpu-tsc-frequency.args            |  2 +-
c1c534
 .../qemuxml2argv-q35-acpi-nouefi.args              |  2 +-
c1c534
 .../qemuxml2argv-q35-acpi-uefi.args                |  2 +-
c1c534
 .../qemuxml2argv-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
c1c534
index b1cfafa790..365555ca87 100644
6d3351
--- a/src/qemu/qemu_command.c
6d3351
+++ b/src/qemu/qemu_command.c
c1c534
@@ -6857,6 +6857,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;
c1c534
@@ -6911,6 +6913,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:
c1c534
@@ -6934,6 +6941,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);
6d3351
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-Haswell.args b/tests/qemuxml2argvdata/qemuxml2argv-cpu-Haswell.args
c1c534
index 06c9eed5b9..553b91c83b 100644
6d3351
--- a/tests/qemuxml2argvdata/qemuxml2argv-cpu-Haswell.args
6d3351
+++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-Haswell.args
6d3351
@@ -8,7 +8,7 @@ QEMU_AUDIO_DRV=none \
6d3351
 -name QEMUGuest1 \
6d3351
 -S \
6d3351
 -M pc \
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 \
6d3351
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-host-model-cmt.args b/tests/qemuxml2argvdata/qemuxml2argv-cpu-host-model-cmt.args
c1c534
index ef45d98300..28cdf92782 100644
6d3351
--- a/tests/qemuxml2argvdata/qemuxml2argv-cpu-host-model-cmt.args
6d3351
+++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-host-model-cmt.args
6d3351
@@ -9,7 +9,8 @@ QEMU_AUDIO_DRV=none \
6d3351
 -S \
6d3351
 -M pc \
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 \
6d3351
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-tsc-frequency.args b/tests/qemuxml2argvdata/qemuxml2argv-cpu-tsc-frequency.args
c1c534
index 3e2da0f242..53193c6fe2 100644
6d3351
--- a/tests/qemuxml2argvdata/qemuxml2argv-cpu-tsc-frequency.args
6d3351
+++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-tsc-frequency.args
6d3351
@@ -10,7 +10,7 @@ QEMU_AUDIO_DRV=none \
6d3351
 -M pc \
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 \
c1c534
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-q35-acpi-nouefi.args b/tests/qemuxml2argvdata/qemuxml2argv-q35-acpi-nouefi.args
c1c534
index 503045de6b..5e1d3b4eb0 100644
c1c534
--- a/tests/qemuxml2argvdata/qemuxml2argv-q35-acpi-nouefi.args
c1c534
+++ b/tests/qemuxml2argvdata/qemuxml2argv-q35-acpi-nouefi.args
c1c534
@@ -8,7 +8,7 @@ QEMU_AUDIO_DRV=none \
c1c534
 -name guest \
c1c534
 -S \
c1c534
 -M q35 \
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 \
c1c534
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-q35-acpi-uefi.args b/tests/qemuxml2argvdata/qemuxml2argv-q35-acpi-uefi.args
c1c534
index fbbbcf9812..40214c69e8 100644
c1c534
--- a/tests/qemuxml2argvdata/qemuxml2argv-q35-acpi-uefi.args
c1c534
+++ b/tests/qemuxml2argvdata/qemuxml2argv-q35-acpi-uefi.args
c1c534
@@ -8,7 +8,7 @@ QEMU_AUDIO_DRV=none \
c1c534
 -name guest \
c1c534
 -S \
c1c534
 -M q35 \
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,\
c1c534
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-q35-noacpi-nouefi.args b/tests/qemuxml2argvdata/qemuxml2argv-q35-noacpi-nouefi.args
c1c534
index de2a7f30bc..1be5968e02 100644
c1c534
--- a/tests/qemuxml2argvdata/qemuxml2argv-q35-noacpi-nouefi.args
c1c534
+++ b/tests/qemuxml2argvdata/qemuxml2argv-q35-noacpi-nouefi.args
c1c534
@@ -8,7 +8,7 @@ QEMU_AUDIO_DRV=none \
c1c534
 -name guest \
c1c534
 -S \
c1c534
 -M q35 \
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
-- 
c1c534
2.14.3
6d3351