From: "Andreas Färber" <afaerber@suse.de>
To: "Benoît Canet" <benoit@irqsave.net>
Cc: qemu-devel@nongnu.org, imammedo@redhat.com, ehabkost@redhat.com,
"kvm@vger.kernel.org list" <kvm@vger.kernel.org>
Subject: Re: [Qemu-devel] [PATCH] i386: forward CPUID cache leaves when -cpu host is used
Date: Mon, 02 Sep 2013 14:55:36 +0200 [thread overview]
Message-ID: <52248AC8.4040404@suse.de> (raw)
In-Reply-To: <1377635906-17274-2-git-send-email-benoit@irqsave.net>
Hi,
"target-i386:" please.
Am 27.08.2013 22:38, schrieb Benoît Canet:
> Some users running cpu intensive tasks checking the cache CPUID leaves at
> startup and making decisions based on the result reported that the guest was
> not reflecting the host CPUID leaves when -cpu host is used.
>
> This patch fix this.
>
> Signed-off-by: Benoit Canet <benoit@irqsave.net>
> ---
> target-i386/cpu.c | 19 +++++++++++++++++++
> target-i386/cpu.h | 1 +
> 2 files changed, 20 insertions(+)
>
> diff --git a/target-i386/cpu.c b/target-i386/cpu.c
> index 42c5de0..2c8eaf7 100644
> --- a/target-i386/cpu.c
> +++ b/target-i386/cpu.c
> @@ -374,6 +374,7 @@ typedef struct x86_def_t {
> int stepping;
> FeatureWordArray features;
> char model_id[48];
> + bool fwd_cpuid_cache_leaves;
> } x86_def_t;
>
> #define I486_FEATURES (CPUID_FP87 | CPUID_VME | CPUID_PSE)
> @@ -1027,6 +1028,7 @@ static void kvm_cpu_fill_host(x86_def_t *x86_cpu_def)
> assert(kvm_enabled());
>
> x86_cpu_def->name = "host";
> + x86_cpu_def->fwd_cpuid_cache_leaves = true;
> host_cpuid(0x0, 0, &eax, &ebx, &ecx, &edx);
> x86_cpu_vendor_words2str(x86_cpu_def->vendor, ebx, edx, ecx);
>
> @@ -1776,6 +1778,7 @@ static void cpu_x86_register(X86CPU *cpu, const char *name, Error **errp)
> env->features[FEAT_C000_0001_EDX] = def->features[FEAT_C000_0001_EDX];
> env->features[FEAT_7_0_EBX] = def->features[FEAT_7_0_EBX];
> env->cpuid_xlevel2 = def->xlevel2;
> + env->fwd_cpuid_cache_leaves = def->fwd_cpuid_cache_leaves;
>
> object_property_set_str(OBJECT(cpu), def->model_id, "model-id", errp);
> }
> @@ -1949,6 +1952,10 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
> }
> break;
> case 2:
> + if (env->fwd_cpuid_cache_leaves) {
> + host_cpuid(0x2, 0, eax, ebx, ecx, edx);
> + break;
> + }
> /* cache info: needed for Pentium Pro compatibility */
> *eax = 1;
> *ebx = 0;
> @@ -1956,6 +1963,10 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
> *edx = 0x2c307d;
> break;
> case 4:
> + if (env->fwd_cpuid_cache_leaves) {
> + host_cpuid(0x4, count, eax, ebx, ecx, edx);
> + break;
> + }
> /* cache info: needed for Core compatibility */
> if (cs->nr_cores > 1) {
> *eax = (cs->nr_cores - 1) << 26;
> @@ -2102,6 +2113,10 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
> break;
> case 0x80000005:
> /* cache info (L1 cache) */
> + if (env->fwd_cpuid_cache_leaves) {
> + host_cpuid(0x80000005, 0, eax, ebx, ecx, edx);
> + break;
> + }
> *eax = 0x01ff01ff;
> *ebx = 0x01ff01ff;
> *ecx = 0x40020140;
> @@ -2109,6 +2124,10 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
> break;
> case 0x80000006:
> /* cache info (L2 cache) */
> + if (env->fwd_cpuid_cache_leaves) {
> + host_cpuid(0x80000006, 0, eax, ebx, ecx, edx);
> + break;
> + }
> *eax = 0;
> *ebx = 0x42004200;
> *ecx = 0x02008140;
This hunk may trivially conflict with Eduardo's cache flags cleanup.
> diff --git a/target-i386/cpu.h b/target-i386/cpu.h
> index 8a3d0fd..1ec32fa 100644
> --- a/target-i386/cpu.h
> +++ b/target-i386/cpu.h
> @@ -865,6 +865,7 @@ typedef struct CPUX86State {
> bool tsc_valid;
> int tsc_khz;
> void *kvm_xsave_buf;
> + bool fwd_cpuid_cache_leaves;
>
> /* in order to simplify APIC support, we leave this pointer to the
> user */
Please place the field in X86CPU instead and document it.
Otherwise patch looks okay to me on a brief sight; but since this is
about -cpu host I would prefer this to go through uq/master once fixed
or at least to get some acks.
Regards,
Andreas
--
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg
WARNING: multiple messages have this Message-ID (diff)
From: "Andreas Färber" <afaerber@suse.de>
To: "Benoît Canet" <benoit@irqsave.net>
Cc: imammedo@redhat.com, qemu-devel@nongnu.org,
"kvm@vger.kernel.org list" <kvm@vger.kernel.org>,
ehabkost@redhat.com
Subject: Re: [Qemu-devel] [PATCH] i386: forward CPUID cache leaves when -cpu host is used
Date: Mon, 02 Sep 2013 14:55:36 +0200 [thread overview]
Message-ID: <52248AC8.4040404@suse.de> (raw)
In-Reply-To: <1377635906-17274-2-git-send-email-benoit@irqsave.net>
Hi,
"target-i386:" please.
Am 27.08.2013 22:38, schrieb Benoît Canet:
> Some users running cpu intensive tasks checking the cache CPUID leaves at
> startup and making decisions based on the result reported that the guest was
> not reflecting the host CPUID leaves when -cpu host is used.
>
> This patch fix this.
>
> Signed-off-by: Benoit Canet <benoit@irqsave.net>
> ---
> target-i386/cpu.c | 19 +++++++++++++++++++
> target-i386/cpu.h | 1 +
> 2 files changed, 20 insertions(+)
>
> diff --git a/target-i386/cpu.c b/target-i386/cpu.c
> index 42c5de0..2c8eaf7 100644
> --- a/target-i386/cpu.c
> +++ b/target-i386/cpu.c
> @@ -374,6 +374,7 @@ typedef struct x86_def_t {
> int stepping;
> FeatureWordArray features;
> char model_id[48];
> + bool fwd_cpuid_cache_leaves;
> } x86_def_t;
>
> #define I486_FEATURES (CPUID_FP87 | CPUID_VME | CPUID_PSE)
> @@ -1027,6 +1028,7 @@ static void kvm_cpu_fill_host(x86_def_t *x86_cpu_def)
> assert(kvm_enabled());
>
> x86_cpu_def->name = "host";
> + x86_cpu_def->fwd_cpuid_cache_leaves = true;
> host_cpuid(0x0, 0, &eax, &ebx, &ecx, &edx);
> x86_cpu_vendor_words2str(x86_cpu_def->vendor, ebx, edx, ecx);
>
> @@ -1776,6 +1778,7 @@ static void cpu_x86_register(X86CPU *cpu, const char *name, Error **errp)
> env->features[FEAT_C000_0001_EDX] = def->features[FEAT_C000_0001_EDX];
> env->features[FEAT_7_0_EBX] = def->features[FEAT_7_0_EBX];
> env->cpuid_xlevel2 = def->xlevel2;
> + env->fwd_cpuid_cache_leaves = def->fwd_cpuid_cache_leaves;
>
> object_property_set_str(OBJECT(cpu), def->model_id, "model-id", errp);
> }
> @@ -1949,6 +1952,10 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
> }
> break;
> case 2:
> + if (env->fwd_cpuid_cache_leaves) {
> + host_cpuid(0x2, 0, eax, ebx, ecx, edx);
> + break;
> + }
> /* cache info: needed for Pentium Pro compatibility */
> *eax = 1;
> *ebx = 0;
> @@ -1956,6 +1963,10 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
> *edx = 0x2c307d;
> break;
> case 4:
> + if (env->fwd_cpuid_cache_leaves) {
> + host_cpuid(0x4, count, eax, ebx, ecx, edx);
> + break;
> + }
> /* cache info: needed for Core compatibility */
> if (cs->nr_cores > 1) {
> *eax = (cs->nr_cores - 1) << 26;
> @@ -2102,6 +2113,10 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
> break;
> case 0x80000005:
> /* cache info (L1 cache) */
> + if (env->fwd_cpuid_cache_leaves) {
> + host_cpuid(0x80000005, 0, eax, ebx, ecx, edx);
> + break;
> + }
> *eax = 0x01ff01ff;
> *ebx = 0x01ff01ff;
> *ecx = 0x40020140;
> @@ -2109,6 +2124,10 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
> break;
> case 0x80000006:
> /* cache info (L2 cache) */
> + if (env->fwd_cpuid_cache_leaves) {
> + host_cpuid(0x80000006, 0, eax, ebx, ecx, edx);
> + break;
> + }
> *eax = 0;
> *ebx = 0x42004200;
> *ecx = 0x02008140;
This hunk may trivially conflict with Eduardo's cache flags cleanup.
> diff --git a/target-i386/cpu.h b/target-i386/cpu.h
> index 8a3d0fd..1ec32fa 100644
> --- a/target-i386/cpu.h
> +++ b/target-i386/cpu.h
> @@ -865,6 +865,7 @@ typedef struct CPUX86State {
> bool tsc_valid;
> int tsc_khz;
> void *kvm_xsave_buf;
> + bool fwd_cpuid_cache_leaves;
>
> /* in order to simplify APIC support, we leave this pointer to the
> user */
Please place the field in X86CPU instead and document it.
Otherwise patch looks okay to me on a brief sight; but since this is
about -cpu host I would prefer this to go through uq/master once fixed
or at least to get some acks.
Regards,
Andreas
--
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg
next prev parent reply other threads:[~2013-09-02 12:55 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-08-27 20:38 [Qemu-devel] [PATCH] forward cpuid leaves when using -cpu host Benoît Canet
2013-08-27 20:38 ` [Qemu-devel] [PATCH] i386: forward CPUID cache leaves when -cpu host is used Benoît Canet
2013-09-02 12:55 ` Andreas Färber [this message]
2013-09-02 12:55 ` Andreas Färber
2013-09-02 13:09 ` Eduardo Habkost
2013-09-02 13:09 ` Eduardo Habkost
2013-09-02 12:45 ` [Qemu-devel] [PATCH] forward cpuid leaves when using -cpu host Benoît Canet
2013-09-02 12:58 ` Eduardo Habkost
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=52248AC8.4040404@suse.de \
--to=afaerber@suse.de \
--cc=benoit@irqsave.net \
--cc=ehabkost@redhat.com \
--cc=imammedo@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=qemu-devel@nongnu.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.