qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH] target/ppc: Avoid printing wrong aliases in CPU help text
@ 2017-03-08 19:05 Thomas Huth
  2017-03-08 20:03 ` Eduardo Habkost
  2017-05-09  4:49 ` [Qemu-devel] [Qemu-ppc] " Thomas Huth
  0 siblings, 2 replies; 4+ messages in thread
From: Thomas Huth @ 2017-03-08 19:05 UTC (permalink / raw)
  To: qemu-ppc, qemu-devel, David Gibson; +Cc: Alexander Graf, Eduardo Habkost

When running with KVM, we update the "family" CPU alias to point
to the right host CPU type, so that it is for example possible to
use "-cpu POWER8" on a POWER8NVL host. However, the function for
printing the list of available CPU models is called earlier than
the KVM setup code, so the output of "-cpu help" is wrong in that
case. Since it would be somewhat ugly anyway to have different
help texts depending on whether "-enable-kvm" has been specified
or not, we should better always print the same text, so fix this
issue by printing "alias for preferred XXX CPU" instead.

Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 target/ppc/cpu.h            |  1 +
 target/ppc/kvm.c            | 12 ------------
 target/ppc/translate_init.c | 27 +++++++++++++++++++++++++--
 3 files changed, 26 insertions(+), 14 deletions(-)

diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
index 7c4a1f5..21752ff 100644
--- a/target/ppc/cpu.h
+++ b/target/ppc/cpu.h
@@ -1216,6 +1216,7 @@ static inline PowerPCCPU *ppc_env_get_cpu(CPUPPCState *env)
 
 PowerPCCPUClass *ppc_cpu_class_by_pvr(uint32_t pvr);
 PowerPCCPUClass *ppc_cpu_class_by_pvr_mask(uint32_t pvr);
+PowerPCCPUClass *ppc_cpu_get_family_class(PowerPCCPUClass *pcc);
 
 struct PPCVirtualHypervisor {
     Object parent;
diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
index 9f1f132..585e6d3 100644
--- a/target/ppc/kvm.c
+++ b/target/ppc/kvm.c
@@ -2304,18 +2304,6 @@ bool kvmppc_has_cap_htm(void)
     return cap_htm;
 }
 
-static PowerPCCPUClass *ppc_cpu_get_family_class(PowerPCCPUClass *pcc)
-{
-    ObjectClass *oc = OBJECT_CLASS(pcc);
-
-    while (oc && !object_class_is_abstract(oc)) {
-        oc = object_class_get_parent(oc);
-    }
-    assert(oc);
-
-    return POWERPC_CPU_CLASS(oc);
-}
-
 PowerPCCPUClass *kvm_ppc_get_host_cpu_class(void)
 {
     uint32_t host_pvr = mfpvr();
diff --git a/target/ppc/translate_init.c b/target/ppc/translate_init.c
index c1a9014..9e9c37f 100644
--- a/target/ppc/translate_init.c
+++ b/target/ppc/translate_init.c
@@ -10249,6 +10249,18 @@ PowerPCCPU *cpu_ppc_init(const char *cpu_model)
     return POWERPC_CPU(cpu_generic_init(TYPE_POWERPC_CPU, cpu_model));
 }
 
+PowerPCCPUClass *ppc_cpu_get_family_class(PowerPCCPUClass *pcc)
+{
+    ObjectClass *oc = OBJECT_CLASS(pcc);
+
+    while (oc && !object_class_is_abstract(oc)) {
+        oc = object_class_get_parent(oc);
+    }
+    assert(oc);
+
+    return POWERPC_CPU_CLASS(oc);
+}
+
 /* Sort by PVR, ordering special case "host" last. */
 static gint ppc_cpu_list_compare(gconstpointer a, gconstpointer b)
 {
@@ -10280,6 +10292,7 @@ static void ppc_cpu_list_entry(gpointer data, gpointer user_data)
     ObjectClass *oc = data;
     CPUListState *s = user_data;
     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
+    DeviceClass *family = DEVICE_CLASS(ppc_cpu_get_family_class(pcc));
     const char *typename = object_class_get_name(oc);
     char *name;
     int i;
@@ -10302,8 +10315,18 @@ static void ppc_cpu_list_entry(gpointer data, gpointer user_data)
         if (alias_oc != oc) {
             continue;
         }
-        (*s->cpu_fprintf)(s->file, "PowerPC %-16s (alias for %s)\n",
-                          alias->alias, name);
+        /*
+         * If running with KVM, we might update the family alias later, so
+         * avoid printing the wrong alias here and use "preferred" instead
+         */
+        if (strcmp(alias->alias, family->desc) == 0) {
+            (*s->cpu_fprintf)(s->file,
+                              "PowerPC %-16s (alias for preferred %s CPU)\n",
+                              alias->alias, family->desc);
+        } else {
+            (*s->cpu_fprintf)(s->file, "PowerPC %-16s (alias for %s)\n",
+                              alias->alias, name);
+        }
     }
     g_free(name);
 }
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [Qemu-devel] [PATCH] target/ppc: Avoid printing wrong aliases in CPU help text
  2017-03-08 19:05 [Qemu-devel] [PATCH] target/ppc: Avoid printing wrong aliases in CPU help text Thomas Huth
@ 2017-03-08 20:03 ` Eduardo Habkost
  2017-05-09  4:49 ` [Qemu-devel] [Qemu-ppc] " Thomas Huth
  1 sibling, 0 replies; 4+ messages in thread
From: Eduardo Habkost @ 2017-03-08 20:03 UTC (permalink / raw)
  To: Thomas Huth; +Cc: qemu-ppc, qemu-devel, David Gibson, Alexander Graf

On Wed, Mar 08, 2017 at 08:05:36PM +0100, Thomas Huth wrote:
> When running with KVM, we update the "family" CPU alias to point
> to the right host CPU type, so that it is for example possible to
> use "-cpu POWER8" on a POWER8NVL host. However, the function for
> printing the list of available CPU models is called earlier than
> the KVM setup code, so the output of "-cpu help" is wrong in that
> case. Since it would be somewhat ugly anyway to have different
> help texts depending on whether "-enable-kvm" has been specified
> or not, we should better always print the same text, so fix this
> issue by printing "alias for preferred XXX CPU" instead.
> 
> Signed-off-by: Thomas Huth <thuth@redhat.com>

Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>

But I wonder if it wouldn't be safer and easier to follow if we
just added a bool field to PowerPCCPUAlias to indicate which
aliases are not accel-independent. When I looked at
ppc_cpu_aliases[] the first time, I had no idea the table was not
100% static and would be changed by KVM code.

> ---
>  target/ppc/cpu.h            |  1 +
>  target/ppc/kvm.c            | 12 ------------
>  target/ppc/translate_init.c | 27 +++++++++++++++++++++++++--
>  3 files changed, 26 insertions(+), 14 deletions(-)
> 
> diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
> index 7c4a1f5..21752ff 100644
> --- a/target/ppc/cpu.h
> +++ b/target/ppc/cpu.h
> @@ -1216,6 +1216,7 @@ static inline PowerPCCPU *ppc_env_get_cpu(CPUPPCState *env)
>  
>  PowerPCCPUClass *ppc_cpu_class_by_pvr(uint32_t pvr);
>  PowerPCCPUClass *ppc_cpu_class_by_pvr_mask(uint32_t pvr);
> +PowerPCCPUClass *ppc_cpu_get_family_class(PowerPCCPUClass *pcc);
>  
>  struct PPCVirtualHypervisor {
>      Object parent;
> diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
> index 9f1f132..585e6d3 100644
> --- a/target/ppc/kvm.c
> +++ b/target/ppc/kvm.c
> @@ -2304,18 +2304,6 @@ bool kvmppc_has_cap_htm(void)
>      return cap_htm;
>  }
>  
> -static PowerPCCPUClass *ppc_cpu_get_family_class(PowerPCCPUClass *pcc)
> -{
> -    ObjectClass *oc = OBJECT_CLASS(pcc);
> -
> -    while (oc && !object_class_is_abstract(oc)) {
> -        oc = object_class_get_parent(oc);
> -    }
> -    assert(oc);
> -
> -    return POWERPC_CPU_CLASS(oc);
> -}
> -
>  PowerPCCPUClass *kvm_ppc_get_host_cpu_class(void)
>  {
>      uint32_t host_pvr = mfpvr();
> diff --git a/target/ppc/translate_init.c b/target/ppc/translate_init.c
> index c1a9014..9e9c37f 100644
> --- a/target/ppc/translate_init.c
> +++ b/target/ppc/translate_init.c
> @@ -10249,6 +10249,18 @@ PowerPCCPU *cpu_ppc_init(const char *cpu_model)
>      return POWERPC_CPU(cpu_generic_init(TYPE_POWERPC_CPU, cpu_model));
>  }
>  
> +PowerPCCPUClass *ppc_cpu_get_family_class(PowerPCCPUClass *pcc)
> +{
> +    ObjectClass *oc = OBJECT_CLASS(pcc);
> +
> +    while (oc && !object_class_is_abstract(oc)) {
> +        oc = object_class_get_parent(oc);
> +    }
> +    assert(oc);
> +
> +    return POWERPC_CPU_CLASS(oc);
> +}
> +
>  /* Sort by PVR, ordering special case "host" last. */
>  static gint ppc_cpu_list_compare(gconstpointer a, gconstpointer b)
>  {
> @@ -10280,6 +10292,7 @@ static void ppc_cpu_list_entry(gpointer data, gpointer user_data)
>      ObjectClass *oc = data;
>      CPUListState *s = user_data;
>      PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
> +    DeviceClass *family = DEVICE_CLASS(ppc_cpu_get_family_class(pcc));
>      const char *typename = object_class_get_name(oc);
>      char *name;
>      int i;
> @@ -10302,8 +10315,18 @@ static void ppc_cpu_list_entry(gpointer data, gpointer user_data)
>          if (alias_oc != oc) {
>              continue;
>          }
> -        (*s->cpu_fprintf)(s->file, "PowerPC %-16s (alias for %s)\n",
> -                          alias->alias, name);
> +        /*
> +         * If running with KVM, we might update the family alias later, so
> +         * avoid printing the wrong alias here and use "preferred" instead
> +         */
> +        if (strcmp(alias->alias, family->desc) == 0) {
> +            (*s->cpu_fprintf)(s->file,
> +                              "PowerPC %-16s (alias for preferred %s CPU)\n",
> +                              alias->alias, family->desc);
> +        } else {
> +            (*s->cpu_fprintf)(s->file, "PowerPC %-16s (alias for %s)\n",
> +                              alias->alias, name);
> +        }
>      }
>      g_free(name);
>  }
> -- 
> 1.8.3.1
> 

-- 
Eduardo

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Qemu-devel] [Qemu-ppc] [PATCH] target/ppc: Avoid printing wrong aliases in CPU help text
  2017-03-08 19:05 [Qemu-devel] [PATCH] target/ppc: Avoid printing wrong aliases in CPU help text Thomas Huth
  2017-03-08 20:03 ` Eduardo Habkost
@ 2017-05-09  4:49 ` Thomas Huth
  2017-05-09  7:11   ` David Gibson
  1 sibling, 1 reply; 4+ messages in thread
From: Thomas Huth @ 2017-05-09  4:49 UTC (permalink / raw)
  To: qemu-ppc, qemu-devel, David Gibson; +Cc: Eduardo Habkost

On 08.03.2017 20:05, Thomas Huth wrote:
> When running with KVM, we update the "family" CPU alias to point
> to the right host CPU type, so that it is for example possible to
> use "-cpu POWER8" on a POWER8NVL host. However, the function for
> printing the list of available CPU models is called earlier than
> the KVM setup code, so the output of "-cpu help" is wrong in that
> case. Since it would be somewhat ugly anyway to have different
> help texts depending on whether "-enable-kvm" has been specified
> or not, we should better always print the same text, so fix this
> issue by printing "alias for preferred XXX CPU" instead.
> 
> Signed-off-by: Thomas Huth <thuth@redhat.com>
> ---
>  target/ppc/cpu.h            |  1 +
>  target/ppc/kvm.c            | 12 ------------
>  target/ppc/translate_init.c | 27 +++++++++++++++++++++++++--
>  3 files changed, 26 insertions(+), 14 deletions(-)
> 
> diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
> index 7c4a1f5..21752ff 100644
> --- a/target/ppc/cpu.h
> +++ b/target/ppc/cpu.h
> @@ -1216,6 +1216,7 @@ static inline PowerPCCPU *ppc_env_get_cpu(CPUPPCState *env)
>  
>  PowerPCCPUClass *ppc_cpu_class_by_pvr(uint32_t pvr);
>  PowerPCCPUClass *ppc_cpu_class_by_pvr_mask(uint32_t pvr);
> +PowerPCCPUClass *ppc_cpu_get_family_class(PowerPCCPUClass *pcc);
>  
>  struct PPCVirtualHypervisor {
>      Object parent;
> diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
> index 9f1f132..585e6d3 100644
> --- a/target/ppc/kvm.c
> +++ b/target/ppc/kvm.c
> @@ -2304,18 +2304,6 @@ bool kvmppc_has_cap_htm(void)
>      return cap_htm;
>  }
>  
> -static PowerPCCPUClass *ppc_cpu_get_family_class(PowerPCCPUClass *pcc)
> -{
> -    ObjectClass *oc = OBJECT_CLASS(pcc);
> -
> -    while (oc && !object_class_is_abstract(oc)) {
> -        oc = object_class_get_parent(oc);
> -    }
> -    assert(oc);
> -
> -    return POWERPC_CPU_CLASS(oc);
> -}
> -
>  PowerPCCPUClass *kvm_ppc_get_host_cpu_class(void)
>  {
>      uint32_t host_pvr = mfpvr();
> diff --git a/target/ppc/translate_init.c b/target/ppc/translate_init.c
> index c1a9014..9e9c37f 100644
> --- a/target/ppc/translate_init.c
> +++ b/target/ppc/translate_init.c
> @@ -10249,6 +10249,18 @@ PowerPCCPU *cpu_ppc_init(const char *cpu_model)
>      return POWERPC_CPU(cpu_generic_init(TYPE_POWERPC_CPU, cpu_model));
>  }
>  
> +PowerPCCPUClass *ppc_cpu_get_family_class(PowerPCCPUClass *pcc)
> +{
> +    ObjectClass *oc = OBJECT_CLASS(pcc);
> +
> +    while (oc && !object_class_is_abstract(oc)) {
> +        oc = object_class_get_parent(oc);
> +    }
> +    assert(oc);
> +
> +    return POWERPC_CPU_CLASS(oc);
> +}
> +
>  /* Sort by PVR, ordering special case "host" last. */
>  static gint ppc_cpu_list_compare(gconstpointer a, gconstpointer b)
>  {
> @@ -10280,6 +10292,7 @@ static void ppc_cpu_list_entry(gpointer data, gpointer user_data)
>      ObjectClass *oc = data;
>      CPUListState *s = user_data;
>      PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
> +    DeviceClass *family = DEVICE_CLASS(ppc_cpu_get_family_class(pcc));
>      const char *typename = object_class_get_name(oc);
>      char *name;
>      int i;
> @@ -10302,8 +10315,18 @@ static void ppc_cpu_list_entry(gpointer data, gpointer user_data)
>          if (alias_oc != oc) {
>              continue;
>          }
> -        (*s->cpu_fprintf)(s->file, "PowerPC %-16s (alias for %s)\n",
> -                          alias->alias, name);
> +        /*
> +         * If running with KVM, we might update the family alias later, so
> +         * avoid printing the wrong alias here and use "preferred" instead
> +         */
> +        if (strcmp(alias->alias, family->desc) == 0) {
> +            (*s->cpu_fprintf)(s->file,
> +                              "PowerPC %-16s (alias for preferred %s CPU)\n",
> +                              alias->alias, family->desc);
> +        } else {
> +            (*s->cpu_fprintf)(s->file, "PowerPC %-16s (alias for %s)\n",
> +                              alias->alias, name);
> +        }
>      }
>      g_free(name);
>  }
> 

Ping!

... I think this got somehow lost in the 2.9 rush ...

 Thomas

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Qemu-devel] [Qemu-ppc] [PATCH] target/ppc: Avoid printing wrong aliases in CPU help text
  2017-05-09  4:49 ` [Qemu-devel] [Qemu-ppc] " Thomas Huth
@ 2017-05-09  7:11   ` David Gibson
  0 siblings, 0 replies; 4+ messages in thread
From: David Gibson @ 2017-05-09  7:11 UTC (permalink / raw)
  To: Thomas Huth; +Cc: qemu-ppc, qemu-devel, Eduardo Habkost

[-- Attachment #1: Type: text/plain, Size: 4758 bytes --]

On Tue, May 09, 2017 at 06:49:29AM +0200, Thomas Huth wrote:
> On 08.03.2017 20:05, Thomas Huth wrote:
> > When running with KVM, we update the "family" CPU alias to point
> > to the right host CPU type, so that it is for example possible to
> > use "-cpu POWER8" on a POWER8NVL host. However, the function for
> > printing the list of available CPU models is called earlier than
> > the KVM setup code, so the output of "-cpu help" is wrong in that
> > case. Since it would be somewhat ugly anyway to have different
> > help texts depending on whether "-enable-kvm" has been specified
> > or not, we should better always print the same text, so fix this
> > issue by printing "alias for preferred XXX CPU" instead.
> > 
> > Signed-off-by: Thomas Huth <thuth@redhat.com>
> > ---
> >  target/ppc/cpu.h            |  1 +
> >  target/ppc/kvm.c            | 12 ------------
> >  target/ppc/translate_init.c | 27 +++++++++++++++++++++++++--
> >  3 files changed, 26 insertions(+), 14 deletions(-)
> > 
> > diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
> > index 7c4a1f5..21752ff 100644
> > --- a/target/ppc/cpu.h
> > +++ b/target/ppc/cpu.h
> > @@ -1216,6 +1216,7 @@ static inline PowerPCCPU *ppc_env_get_cpu(CPUPPCState *env)
> >  
> >  PowerPCCPUClass *ppc_cpu_class_by_pvr(uint32_t pvr);
> >  PowerPCCPUClass *ppc_cpu_class_by_pvr_mask(uint32_t pvr);
> > +PowerPCCPUClass *ppc_cpu_get_family_class(PowerPCCPUClass *pcc);
> >  
> >  struct PPCVirtualHypervisor {
> >      Object parent;
> > diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
> > index 9f1f132..585e6d3 100644
> > --- a/target/ppc/kvm.c
> > +++ b/target/ppc/kvm.c
> > @@ -2304,18 +2304,6 @@ bool kvmppc_has_cap_htm(void)
> >      return cap_htm;
> >  }
> >  
> > -static PowerPCCPUClass *ppc_cpu_get_family_class(PowerPCCPUClass *pcc)
> > -{
> > -    ObjectClass *oc = OBJECT_CLASS(pcc);
> > -
> > -    while (oc && !object_class_is_abstract(oc)) {
> > -        oc = object_class_get_parent(oc);
> > -    }
> > -    assert(oc);
> > -
> > -    return POWERPC_CPU_CLASS(oc);
> > -}
> > -
> >  PowerPCCPUClass *kvm_ppc_get_host_cpu_class(void)
> >  {
> >      uint32_t host_pvr = mfpvr();
> > diff --git a/target/ppc/translate_init.c b/target/ppc/translate_init.c
> > index c1a9014..9e9c37f 100644
> > --- a/target/ppc/translate_init.c
> > +++ b/target/ppc/translate_init.c
> > @@ -10249,6 +10249,18 @@ PowerPCCPU *cpu_ppc_init(const char *cpu_model)
> >      return POWERPC_CPU(cpu_generic_init(TYPE_POWERPC_CPU, cpu_model));
> >  }
> >  
> > +PowerPCCPUClass *ppc_cpu_get_family_class(PowerPCCPUClass *pcc)
> > +{
> > +    ObjectClass *oc = OBJECT_CLASS(pcc);
> > +
> > +    while (oc && !object_class_is_abstract(oc)) {
> > +        oc = object_class_get_parent(oc);
> > +    }
> > +    assert(oc);
> > +
> > +    return POWERPC_CPU_CLASS(oc);
> > +}
> > +
> >  /* Sort by PVR, ordering special case "host" last. */
> >  static gint ppc_cpu_list_compare(gconstpointer a, gconstpointer b)
> >  {
> > @@ -10280,6 +10292,7 @@ static void ppc_cpu_list_entry(gpointer data, gpointer user_data)
> >      ObjectClass *oc = data;
> >      CPUListState *s = user_data;
> >      PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
> > +    DeviceClass *family = DEVICE_CLASS(ppc_cpu_get_family_class(pcc));
> >      const char *typename = object_class_get_name(oc);
> >      char *name;
> >      int i;
> > @@ -10302,8 +10315,18 @@ static void ppc_cpu_list_entry(gpointer data, gpointer user_data)
> >          if (alias_oc != oc) {
> >              continue;
> >          }
> > -        (*s->cpu_fprintf)(s->file, "PowerPC %-16s (alias for %s)\n",
> > -                          alias->alias, name);
> > +        /*
> > +         * If running with KVM, we might update the family alias later, so
> > +         * avoid printing the wrong alias here and use "preferred" instead
> > +         */
> > +        if (strcmp(alias->alias, family->desc) == 0) {
> > +            (*s->cpu_fprintf)(s->file,
> > +                              "PowerPC %-16s (alias for preferred %s CPU)\n",
> > +                              alias->alias, family->desc);
> > +        } else {
> > +            (*s->cpu_fprintf)(s->file, "PowerPC %-16s (alias for %s)\n",
> > +                              alias->alias, name);
> > +        }
> >      }
> >      g_free(name);
> >  }
> > 
> 
> Ping!
> 
> ... I think this got somehow lost in the 2.9 rush ...

Yes, I think so.  Can you make sure it's rebased and repost, please.

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2017-05-10  0:54 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-03-08 19:05 [Qemu-devel] [PATCH] target/ppc: Avoid printing wrong aliases in CPU help text Thomas Huth
2017-03-08 20:03 ` Eduardo Habkost
2017-05-09  4:49 ` [Qemu-devel] [Qemu-ppc] " Thomas Huth
2017-05-09  7:11   ` David Gibson

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).