All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: "Benoît Canet" <benoit@irqsave.net>
Cc: qemu-devel@nongnu.org, imammedo@redhat.com, afaerber@suse.de,
	kvm@vger.kernel.org, ehabkost@redhat.com
Subject: Re: [PATCH V3] target-i386: forward CPUID cache leaves when -cpu host is used
Date: Thu, 19 Sep 2013 19:33:49 +0200	[thread overview]
Message-ID: <523B357D.8090506@redhat.com> (raw)
In-Reply-To: <1378134397-16547-2-git-send-email-benoit@irqsave.net>

Il 02/09/2013 17:06, Benoît Canet ha scritto:
> 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-qom.h |    3 +++
>  target-i386/cpu.c     |   19 +++++++++++++++++++
>  2 files changed, 22 insertions(+)
> 
> diff --git a/target-i386/cpu-qom.h b/target-i386/cpu-qom.h
> index c4447c2..b1d1bd8 100644
> --- a/target-i386/cpu-qom.h
> +++ b/target-i386/cpu-qom.h
> @@ -70,6 +70,9 @@ typedef struct X86CPU {
>      bool hyperv_relaxed_timing;
>      int hyperv_spinlock_attempts;
>  
> +    /* if true the CPUID code directly forward host cache leaves to the guest */
> +    bool fwd_host_cache_info;
> +
>      /* Features that were filtered out because of missing host capabilities */
>      uint32_t filtered_features[FEATURE_WORDS];
>  
> diff --git a/target-i386/cpu.c b/target-i386/cpu.c
> index c36345e..f0df4db 100644
> --- a/target-i386/cpu.c
> +++ b/target-i386/cpu.c
> @@ -486,6 +486,7 @@ typedef struct x86_def_t {
>      int stepping;
>      FeatureWordArray features;
>      char model_id[48];
> +    bool fwd_host_cache_info;
>  } x86_def_t;
>  
>  #define I486_FEATURES (CPUID_FP87 | CPUID_VME | CPUID_PSE)
> @@ -1139,6 +1140,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_host_cache_info = true;
>      host_cpuid(0x0, 0, &eax, &ebx, &ecx, &edx);
>      x86_cpu_vendor_words2str(x86_cpu_def->vendor, ebx, edx, ecx);
>  
> @@ -1888,6 +1890,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;
> +    cpu->fwd_host_cache_info = def->fwd_host_cache_info;
>  
>      object_property_set_str(OBJECT(cpu), def->model_id, "model-id", errp);
>  }
> @@ -2062,6 +2065,10 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
>          break;
>      case 2:
>          /* cache info: needed for Pentium Pro compatibility */
> +        if (cpu->fwd_host_cache_info) {
> +            host_cpuid(index, 0, eax, ebx, ecx, edx);
> +            break;
> +        }
>          *eax = 1; /* Number of CPUID[EAX=2] calls required */
>          *ebx = 0;
>          *ecx = 0;
> @@ -2071,6 +2078,10 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
>          break;
>      case 4:
>          /* cache info: needed for Core compatibility */
> +        if (cpu->fwd_host_cache_info) {
> +            host_cpuid(index, count, eax, ebx, ecx, edx);
> +            break;
> +        }
>          if (cs->nr_cores > 1) {
>              *eax = (cs->nr_cores - 1) << 26;
>          } else {
> @@ -2228,6 +2239,10 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
>          break;
>      case 0x80000005:
>          /* cache info (L1 cache) */
> +        if (cpu->fwd_host_cache_info) {
> +            host_cpuid(index, 0, eax, ebx, ecx, edx);
> +            break;
> +        }
>          *eax = (L1_DTLB_2M_ASSOC << 24) | (L1_DTLB_2M_ENTRIES << 16) | \
>                 (L1_ITLB_2M_ASSOC <<  8) | (L1_ITLB_2M_ENTRIES);
>          *ebx = (L1_DTLB_4K_ASSOC << 24) | (L1_DTLB_4K_ENTRIES << 16) | \
> @@ -2239,6 +2254,10 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
>          break;
>      case 0x80000006:
>          /* cache info (L2 cache) */
> +        if (cpu->fwd_host_cache_info) {
> +            host_cpuid(index, 0, eax, ebx, ecx, edx);
> +            break;
> +        }
>          *eax = (AMD_ENC_ASSOC(L2_DTLB_2M_ASSOC) << 28) | \
>                 (L2_DTLB_2M_ENTRIES << 16) | \
>                 (AMD_ENC_ASSOC(L2_ITLB_2M_ASSOC) << 12) | \
> 

I renamed the new field to cache_info_passthrough (Eduardo had a
"pmu_passthrough" patch a few weeks ago) and will push it tomorrow to
uq/master.  Thanks,

Paolo

WARNING: multiple messages have this Message-ID (diff)
From: Paolo Bonzini <pbonzini@redhat.com>
To: "Benoît Canet" <benoit@irqsave.net>
Cc: imammedo@redhat.com, ehabkost@redhat.com, qemu-devel@nongnu.org,
	kvm@vger.kernel.org, afaerber@suse.de
Subject: Re: [Qemu-devel] [PATCH V3] target-i386: forward CPUID cache leaves when -cpu host is used
Date: Thu, 19 Sep 2013 19:33:49 +0200	[thread overview]
Message-ID: <523B357D.8090506@redhat.com> (raw)
In-Reply-To: <1378134397-16547-2-git-send-email-benoit@irqsave.net>

Il 02/09/2013 17:06, Benoît Canet ha scritto:
> 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-qom.h |    3 +++
>  target-i386/cpu.c     |   19 +++++++++++++++++++
>  2 files changed, 22 insertions(+)
> 
> diff --git a/target-i386/cpu-qom.h b/target-i386/cpu-qom.h
> index c4447c2..b1d1bd8 100644
> --- a/target-i386/cpu-qom.h
> +++ b/target-i386/cpu-qom.h
> @@ -70,6 +70,9 @@ typedef struct X86CPU {
>      bool hyperv_relaxed_timing;
>      int hyperv_spinlock_attempts;
>  
> +    /* if true the CPUID code directly forward host cache leaves to the guest */
> +    bool fwd_host_cache_info;
> +
>      /* Features that were filtered out because of missing host capabilities */
>      uint32_t filtered_features[FEATURE_WORDS];
>  
> diff --git a/target-i386/cpu.c b/target-i386/cpu.c
> index c36345e..f0df4db 100644
> --- a/target-i386/cpu.c
> +++ b/target-i386/cpu.c
> @@ -486,6 +486,7 @@ typedef struct x86_def_t {
>      int stepping;
>      FeatureWordArray features;
>      char model_id[48];
> +    bool fwd_host_cache_info;
>  } x86_def_t;
>  
>  #define I486_FEATURES (CPUID_FP87 | CPUID_VME | CPUID_PSE)
> @@ -1139,6 +1140,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_host_cache_info = true;
>      host_cpuid(0x0, 0, &eax, &ebx, &ecx, &edx);
>      x86_cpu_vendor_words2str(x86_cpu_def->vendor, ebx, edx, ecx);
>  
> @@ -1888,6 +1890,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;
> +    cpu->fwd_host_cache_info = def->fwd_host_cache_info;
>  
>      object_property_set_str(OBJECT(cpu), def->model_id, "model-id", errp);
>  }
> @@ -2062,6 +2065,10 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
>          break;
>      case 2:
>          /* cache info: needed for Pentium Pro compatibility */
> +        if (cpu->fwd_host_cache_info) {
> +            host_cpuid(index, 0, eax, ebx, ecx, edx);
> +            break;
> +        }
>          *eax = 1; /* Number of CPUID[EAX=2] calls required */
>          *ebx = 0;
>          *ecx = 0;
> @@ -2071,6 +2078,10 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
>          break;
>      case 4:
>          /* cache info: needed for Core compatibility */
> +        if (cpu->fwd_host_cache_info) {
> +            host_cpuid(index, count, eax, ebx, ecx, edx);
> +            break;
> +        }
>          if (cs->nr_cores > 1) {
>              *eax = (cs->nr_cores - 1) << 26;
>          } else {
> @@ -2228,6 +2239,10 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
>          break;
>      case 0x80000005:
>          /* cache info (L1 cache) */
> +        if (cpu->fwd_host_cache_info) {
> +            host_cpuid(index, 0, eax, ebx, ecx, edx);
> +            break;
> +        }
>          *eax = (L1_DTLB_2M_ASSOC << 24) | (L1_DTLB_2M_ENTRIES << 16) | \
>                 (L1_ITLB_2M_ASSOC <<  8) | (L1_ITLB_2M_ENTRIES);
>          *ebx = (L1_DTLB_4K_ASSOC << 24) | (L1_DTLB_4K_ENTRIES << 16) | \
> @@ -2239,6 +2254,10 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
>          break;
>      case 0x80000006:
>          /* cache info (L2 cache) */
> +        if (cpu->fwd_host_cache_info) {
> +            host_cpuid(index, 0, eax, ebx, ecx, edx);
> +            break;
> +        }
>          *eax = (AMD_ENC_ASSOC(L2_DTLB_2M_ASSOC) << 28) | \
>                 (L2_DTLB_2M_ENTRIES << 16) | \
>                 (AMD_ENC_ASSOC(L2_ITLB_2M_ASSOC) << 12) | \
> 

I renamed the new field to cache_info_passthrough (Eduardo had a
"pmu_passthrough" patch a few weeks ago) and will push it tomorrow to
uq/master.  Thanks,

Paolo

  parent reply	other threads:[~2013-09-19 17:33 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-09-02 15:06 [PATCH V3] forward cpuid leaves when using -cpu host Benoît Canet
2013-09-02 15:06 ` [Qemu-devel] " Benoît Canet
2013-09-02 15:06 ` [PATCH V3] target-i386: forward CPUID cache leaves when -cpu host is used Benoît Canet
2013-09-02 15:06   ` [Qemu-devel] " Benoît Canet
2013-09-02 16:19   ` Eduardo Habkost
2013-09-02 16:19     ` [Qemu-devel] " Eduardo Habkost
2013-09-02 17:09     ` Benoît Canet
2013-09-02 17:09       ` [Qemu-devel] " Benoît Canet
2013-09-04 17:35       ` Eduardo Habkost
2013-09-19 13:56     ` Benoît Canet
2013-09-19 13:56       ` Benoît Canet
2013-09-19 17:33   ` Paolo Bonzini [this message]
2013-09-19 17:33     ` Paolo Bonzini

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=523B357D.8090506@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=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.