qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Cc: Wei Huang <wei@redhat.com>
Subject: [Qemu-devel] [PULL 15/28] target-i386: warns users when CPU threads>1 for non-Intel CPUs
Date: Mon, 27 Oct 2014 16:13:32 +0100	[thread overview]
Message-ID: <1414422825-6166-16-git-send-email-pbonzini@redhat.com> (raw)
In-Reply-To: <1414422825-6166-1-git-send-email-pbonzini@redhat.com>

From: Wei Huang <wei@redhat.com>

Only Intel CPUs support hyperthreading. When users select threads>1 in
-smp option, QEMU fixes it by adjusting CPUID_0000_0001_EBX and
CPUID_8000_0008_ECX based on inputs (sockets, cores, threads);
so guest VM can boot correctly. However it is still better to gives
users a warning when such case happens.

Signed-off-by: Wei Huang <wei@redhat.com>
[As suggested by Eduardo, check for !IS_INTEL instead of AMD. - Paolo]
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 target-i386/cpu.c | 26 +++++++++++++++++++++++---
 1 file changed, 23 insertions(+), 3 deletions(-)

diff --git a/target-i386/cpu.c b/target-i386/cpu.c
index e7bf9de..69a2bd3 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -2696,6 +2696,13 @@ static void x86_cpu_apic_realize(X86CPU *cpu, Error **errp)
 }
 #endif
 
+
+#define IS_INTEL_CPU(env) ((env)->cpuid_vendor1 == CPUID_VENDOR_INTEL_1 && \
+                           (env)->cpuid_vendor2 == CPUID_VENDOR_INTEL_2 && \
+                           (env)->cpuid_vendor3 == CPUID_VENDOR_INTEL_3)
+#define IS_AMD_CPU(env) ((env)->cpuid_vendor1 == CPUID_VENDOR_AMD_1 && \
+                         (env)->cpuid_vendor2 == CPUID_VENDOR_AMD_2 && \
+                         (env)->cpuid_vendor3 == CPUID_VENDOR_AMD_3)
 static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cs = CPU(dev);
@@ -2703,6 +2710,7 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
     X86CPUClass *xcc = X86_CPU_GET_CLASS(dev);
     CPUX86State *env = &cpu->env;
     Error *local_err = NULL;
+    static bool ht_warned;
 
     if (env->features[FEAT_7_0_EBX] && env->cpuid_level < 7) {
         env->cpuid_level = 7;
@@ -2711,9 +2719,7 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
     /* On AMD CPUs, some CPUID[8000_0001].EDX bits must match the bits on
      * CPUID[1].EDX.
      */
-    if (env->cpuid_vendor1 == CPUID_VENDOR_AMD_1 &&
-        env->cpuid_vendor2 == CPUID_VENDOR_AMD_2 &&
-        env->cpuid_vendor3 == CPUID_VENDOR_AMD_3) {
+    if (IS_AMD_CPU(env)) {
         env->features[FEAT_8000_0001_EDX] &= ~CPUID_EXT2_AMD_ALIASES;
         env->features[FEAT_8000_0001_EDX] |= (env->features[FEAT_1_EDX]
            & CPUID_EXT2_AMD_ALIASES);
@@ -2742,6 +2748,20 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
     mce_init(cpu);
     qemu_init_vcpu(cs);
 
+    /* Only Intel CPUs support hyperthreading. Even though QEMU fixes this
+     * issue by adjusting CPUID_0000_0001_EBX and CPUID_8000_0008_ECX
+     * based on inputs (sockets,cores,threads), it is still better to gives
+     * users a warning.
+     *
+     * NOTE: the following code has to follow qemu_init_vcpu(). Otherwise
+     * cs->nr_threads hasn't be populated yet and the checking is incorrect.
+     */
+    if (!IS_INTEL_CPU(env) && cs->nr_threads > 1 && !ht_warned) {
+        error_report("AMD CPU doesn't support hyperthreading. Please configure"
+                     " -smp options properly.");
+        ht_warned = true;
+    }
+
     x86_cpu_apic_realize(cpu, &local_err);
     if (local_err != NULL) {
         goto out;
-- 
1.8.3.1

  parent reply	other threads:[~2014-10-27 15:14 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-10-27 15:13 [Qemu-devel] [PULL 00/28] Changes for 2014-10-27 Paolo Bonzini
2014-10-27 15:13 ` [Qemu-devel] [PULL 01/28] virtio-scsi-dataplane: Add op blocker Paolo Bonzini
2014-10-27 15:13 ` [Qemu-devel] [PULL 02/28] virtio-scsi: dataplane: print why starting failed Paolo Bonzini
2014-10-27 15:13 ` [Qemu-devel] [PULL 03/28] virtio-scsi: dataplane: fail setup gracefully Paolo Bonzini
2014-10-27 15:13 ` [Qemu-devel] [PULL 04/28] virtio-scsi: dataplane: stop trying on notifier error Paolo Bonzini
2014-10-27 15:13 ` [Qemu-devel] [PULL 05/28] qom: Allow clearing of a Link property Paolo Bonzini
2014-10-27 15:13 ` [Qemu-devel] [PULL 06/28] qom: Demote already-has-a-parent to a regular error Paolo Bonzini
2014-10-27 15:13 ` [Qemu-devel] [PULL 07/28] qdev: gpio: Re-implement qdev_connect_gpio QOM style Paolo Bonzini
2014-10-27 15:13 ` [Qemu-devel] [PULL 08/28] qdev: gpio: Add API for intercepting a GPIO Paolo Bonzini
2014-10-27 15:13 ` [Qemu-devel] [PULL 09/28] qtest/irq: Rework IRQ interception Paolo Bonzini
2014-10-27 15:13 ` [Qemu-devel] [PULL 10/28] irq: Remove qemu_irq_intercept_out Paolo Bonzini
2014-10-27 15:13 ` [Qemu-devel] [PULL 11/28] qdev: gpio: delete NamedGPIOList::out Paolo Bonzini
2014-10-27 15:13 ` [Qemu-devel] [PULL 12/28] qdev: gpio: Remove qdev_init_gpio_out x1 restriction Paolo Bonzini
2014-10-27 15:13 ` [Qemu-devel] [PULL 13/28] qdev: gpio: Define qdev_pass_gpios() Paolo Bonzini
2014-10-27 15:13 ` [Qemu-devel] [PULL 14/28] sysbus: Use TYPE_DEVICE GPIO functionality Paolo Bonzini
2014-10-27 15:13 ` Paolo Bonzini [this message]
2014-10-27 15:13 ` [Qemu-devel] [PULL 16/28] MAINTAINERS: grab more files from Anthony's pile Paolo Bonzini
2014-10-27 15:13 ` [Qemu-devel] [PULL 17/28] MAINTAINERS: add Samuel Thibault as usb-serial.c and baum.c maintainer Paolo Bonzini
2014-10-27 15:16   ` Samuel Thibault
2014-10-27 15:13 ` [Qemu-devel] [PULL 18/28] MAINTAINERS: add myself for X86 Paolo Bonzini
2014-10-27 15:41   ` Aurelien Jarno
2014-10-27 15:49     ` Paolo Bonzini
2014-10-27 15:13 ` [Qemu-devel] [PULL 19/28] MAINTAINERS: Add more TCG files Paolo Bonzini
2014-10-27 15:13 ` [Qemu-devel] [PULL 20/28] MAINTAINERS: add some tests directories Paolo Bonzini
2014-10-27 15:13 ` [Qemu-devel] [PULL 21/28] MAINTAINERS: avoid M entries that point to mailing lists Paolo Bonzini
2014-10-27 15:13 ` [Qemu-devel] [PULL 22/28] qtest: fix qtest log fd should be initialized before qtest chardev Paolo Bonzini
2014-10-27 15:13 ` [Qemu-devel] [PULL 23/28] get_maintainer.pl: move git loop under "if ($email) {" Paolo Bonzini
2014-10-27 15:13 ` [Qemu-devel] [PULL 24/28] get_maintainer.pl: restrict cases where it falls back to --git Paolo Bonzini
2014-10-27 15:13 ` [Qemu-devel] [PULL 25/28] target-i386: add Intel AVX-512 support Paolo Bonzini
2014-10-27 15:13 ` [Qemu-devel] [PULL 26/28] virtio-scsi: sense in virtio_scsi_command_complete Paolo Bonzini
2014-10-27 15:13 ` [Qemu-devel] [PULL 27/28] hw/scsi/virtio-scsi.c: fix the "type" use error in virtio_scsi_handle_ctrl Paolo Bonzini
2014-10-27 15:13 ` [Qemu-devel] [PULL 28/28] aio / timers: De-document -clock Paolo Bonzini
2014-10-27 18:02 ` [Qemu-devel] [PULL 00/28] Changes for 2014-10-27 Andreas Färber
2014-10-28  7:27   ` Paolo Bonzini
2014-10-28 16:40 ` Peter Maydell
2014-10-28 16:49   ` Peter Maydell
2014-10-28 17:57     ` Paolo Bonzini
2014-10-28 23:58       ` Paolo Bonzini
2014-10-30 14:45         ` Peter Maydell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1414422825-6166-16-git-send-email-pbonzini@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=wei@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).