3e5111
From 26d33ed184f16a57b412360e4e75dbbcb9807c76 Mon Sep 17 00:00:00 2001
3e5111
Message-Id: <26d33ed184f16a57b412360e4e75dbbcb9807c76@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
---
7a3408
 src/qemu/qemu_command.c                             | 21 +++++++++++++++++++++
7a3408
 .../qemuxml2argvdata/qemuxml2argv-cpu-Haswell.args  |  2 +-
3e5111
 .../qemuxml2argv-cpu-host-model-cmt.args            |  3 ++-
3e5111
 .../qemuxml2argv-cpu-tsc-frequency.args             |  2 +-
3e5111
 4 files changed, 25 insertions(+), 3 deletions(-)
7a3408
7a3408
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
3e5111
index 64d2d7105..1a2984e56 100644
7a3408
--- a/src/qemu/qemu_command.c
7a3408
+++ b/src/qemu/qemu_command.c
3e5111
@@ -6768,6 +6768,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;
3e5111
@@ -6822,6 +6824,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:
3e5111
@@ -6845,6 +6852,20 @@ 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")) {
3e5111
+        if (!rtm)
3e5111
+            virBufferAddLit(buf, ",+rtm");
3e5111
+        if (!hle)
3e5111
+            virBufferAddLit(buf, ",+hle");
3e5111
+    }
3e5111
+
7a3408
     ret = 0;
3e5111
  cleanup:
3e5111
     virObjectUnref(caps);
7a3408
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-Haswell.args b/tests/qemuxml2argvdata/qemuxml2argv-cpu-Haswell.args
3e5111
index ef0e68b14..2e74a6703 100644
7a3408
--- a/tests/qemuxml2argvdata/qemuxml2argv-cpu-Haswell.args
7a3408
+++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-Haswell.args
6ae9ed
@@ -8,7 +8,7 @@ QEMU_AUDIO_DRV=none \
6ae9ed
 -name QEMUGuest1 \
6ae9ed
 -S \
6ae9ed
 -M pc \
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 \
3e5111
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-host-model-cmt.args b/tests/qemuxml2argvdata/qemuxml2argv-cpu-host-model-cmt.args
3e5111
index 7ae4ac5ad..e02f996ee 100644
3e5111
--- a/tests/qemuxml2argvdata/qemuxml2argv-cpu-host-model-cmt.args
3e5111
+++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-host-model-cmt.args
3e5111
@@ -9,7 +9,8 @@ QEMU_AUDIO_DRV=none \
6ae9ed
 -S \
6ae9ed
 -M pc \
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 \
3e5111
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-tsc-frequency.args b/tests/qemuxml2argvdata/qemuxml2argv-cpu-tsc-frequency.args
3e5111
index 50223fab2..cd9a3ef16 100644
3e5111
--- a/tests/qemuxml2argvdata/qemuxml2argv-cpu-tsc-frequency.args
3e5111
+++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-tsc-frequency.args
3e5111
@@ -10,7 +10,7 @@ QEMU_AUDIO_DRV=none \
3e5111
 -M pc \
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 \
7a3408
-- 
3e5111
2.12.2
7a3408