diff mbox

i386: Support "-cpu host" on TCG too

Message ID 0503ac26-e660-325c-8257-59227c41021d@redhat.com
State New
Headers show

Commit Message

David Hildenbrand Jan. 17, 2017, 5:43 p.m. UTC
Am 16.01.2017 um 20:54 schrieb Eduardo Habkost:
> Change the meaning of "-cpu host" to "enable all features
> supported by the accelerator in the current host", so that it can
> be used to enable/query all features supported by TCG.
>
> To make sure "host" is still at the end of the list in "-cpu
> help", add a "ordering" field that will be used when sorting the
> CPU model list.
>
> Cc: Richard Henderson <rth@twiddle.net>
> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>

I also had the same thing in mind when working on s390x models but
decided to do it like x86. Now that x86 changes ...

Something like that should work for s390x (and I don't think it will 
break any concept). Most probably cleaner to handle this the same
way on all architectures and to not disable tests for s390x.

Uncompiled and untested.

@Conny and Christian, feel free to pick up and modify if this makes
sense

 From 4a2af1ca47421b68eb7677cd91af350dd9be4e0e Mon Sep 17 00:00:00 2001
From: David Hildenbrand <david@redhat.com>
Date: Tue, 17 Jan 2017 18:34:45 +0100
Subject: [PATCH] s390x/cpumodel: allow the "host" model also for tcg

Let's also allow the host model for tcg, therefore meaning
"enable all features supported by the selected accelerator in the current
host".

Signed-off-by: David Hildenbrand <david@redhat.com>
---
  qapi-schema.json          |  4 ++--
  target/s390x/cpu-qom.h    |  1 -
  target/s390x/cpu_models.c | 34 ++++++++--------------------------
  3 files changed, 10 insertions(+), 29 deletions(-)

      obj = object_new(object_class_get_name(oc));
      cpu = S390_CPU(obj);

@@ -718,15 +714,9 @@ static inline void apply_cpu_model(const 
S390CPUModel *model, Error **errp)

  void s390_realize_cpu_model(CPUState *cs, Error **errp)
  {
-    S390CPUClass *xcc = S390_CPU_GET_CLASS(cs);
      S390CPU *cpu = S390_CPU(cs);
      const S390CPUModel *max_model;

-    if (xcc->kvm_required && !kvm_enabled()) {
-        error_setg(errp, "CPU definition requires KVM");
-        return;
-    }
-
      if (!cpu->model) {
          /* no host model support -> perform compatibility stuff */
          apply_cpu_model(NULL, errp);
@@ -904,26 +894,25 @@ static void s390_cpu_model_initfn(Object *obj)
      }
  }

-#ifdef CONFIG_KVM
  static void s390_host_cpu_model_initfn(Object *obj)
  {
+    S390CPUModel *max_model;
      S390CPU *cpu = S390_CPU(obj);
      Error *err = NULL;

-    if (!kvm_enabled() || !kvm_s390_cpu_models_supported()) {
+    if (kvm_enabled() && !kvm_s390_cpu_models_supported()) {
          return;
      }

-    cpu->model = g_malloc0(sizeof(*cpu->model));
-    kvm_s390_get_host_cpu_model(cpu->model, &err);
-    if (err) {
+    max_model = get_max_cpu_model(&err);
+    if (err || !max_model) {
          error_report_err(err);
-        g_free(cpu->model);
          /* fallback to unsupported cpu models */
-        cpu->model = NULL;
+        return;
      }
+    /* copy the host model so it can be modified */
+    cpu->model = g_memdup(max_model, sizeof(*cpu->model));
  }
-#endif

  static void s390_qemu_cpu_model_initfn(Object *obj)
  {
@@ -969,15 +958,12 @@ void 
s390_cpu_model_class_register_props(ObjectClass *oc)
                                    NULL);
  }

-#ifdef CONFIG_KVM
  static void s390_host_cpu_model_class_init(ObjectClass *oc, void *data)
  {
      S390CPUClass *xcc = S390_CPU_CLASS(oc);

-    xcc->kvm_required = true;
-    xcc->desc = "KVM only: All recognized features";
+    xcc->desc = "All supported and available features";
  }
-#endif

  static void s390_base_cpu_model_class_init(ObjectClass *oc, void *data)
  {
@@ -1042,7 +1028,6 @@ static const TypeInfo qemu_s390_cpu_type_info = {
      .class_init = s390_qemu_cpu_model_class_init,
  };

-#ifdef CONFIG_KVM
  static const TypeInfo host_s390_cpu_type_info = {
      .name = S390_CPU_TYPE_NAME("host"),
      .parent = TYPE_S390_CPU,
@@ -1050,7 +1035,6 @@ static const TypeInfo host_s390_cpu_type_info = {
      .instance_finalize = s390_cpu_model_finalize,
      .class_init = s390_host_cpu_model_class_init,
  };
-#endif

  static void register_types(void)
  {
@@ -1093,9 +1077,7 @@ static void register_types(void)
      }

      type_register_static(&qemu_s390_cpu_type_info);
-#ifdef CONFIG_KVM
      type_register_static(&host_s390_cpu_type_info);
-#endif
  }

  type_init(register_types)

Comments

Cornelia Huck Jan. 19, 2017, 2:52 p.m. UTC | #1
On Tue, 17 Jan 2017 18:43:40 +0100
David Hildenbrand <david@redhat.com> wrote:

> Uncompiled and untested.

@Jason: have you given this a try?

> @Conny and Christian, feel free to pick up and modify if this makes
> sense
> 
>  From 4a2af1ca47421b68eb7677cd91af350dd9be4e0e Mon Sep 17 00:00:00 2001
> From: David Hildenbrand <david@redhat.com>
> Date: Tue, 17 Jan 2017 18:34:45 +0100
> Subject: [PATCH] s390x/cpumodel: allow the "host" model also for tcg
> 
> Let's also allow the host model for tcg, therefore meaning
> "enable all features supported by the selected accelerator in the current
> host".
> 
> Signed-off-by: David Hildenbrand <david@redhat.com>
> ---
>   qapi-schema.json          |  4 ++--
>   target/s390x/cpu-qom.h    |  1 -
>   target/s390x/cpu_models.c | 34 ++++++++--------------------------
>   3 files changed, 10 insertions(+), 29 deletions(-)

(...)

> -#ifdef CONFIG_KVM
>   static void s390_host_cpu_model_initfn(Object *obj)
>   {
> +    S390CPUModel *max_model;
>       S390CPU *cpu = S390_CPU(obj);
>       Error *err = NULL;
> 
> -    if (!kvm_enabled() || !kvm_s390_cpu_models_supported()) {
> +    if (kvm_enabled() && !kvm_s390_cpu_models_supported()) {
>           return;
>       }
> 
> -    cpu->model = g_malloc0(sizeof(*cpu->model));
> -    kvm_s390_get_host_cpu_model(cpu->model, &err);
> -    if (err) {
> +    max_model = get_max_cpu_model(&err);
> +    if (err || !max_model) {

I think checking for !max_model is enough.

>           error_report_err(err);
> -        g_free(cpu->model);
>           /* fallback to unsupported cpu models */
> -        cpu->model = NULL;
> +        return;
>       }
> +    /* copy the host model so it can be modified */
> +    cpu->model = g_memdup(max_model, sizeof(*cpu->model));
>   }
> -#endif

(...)

This gives us the same as before on kvm and z900 for tcg, so this seems
reasonable to me.
Christian Borntraeger Feb. 16, 2017, 2:43 p.m. UTC | #2
On 01/17/2017 06:43 PM, David Hildenbrand wrote:
> Am 16.01.2017 um 20:54 schrieb Eduardo Habkost:
>> Change the meaning of "-cpu host" to "enable all features
>> supported by the accelerator in the current host", so that it can
>> be used to enable/query all features supported by TCG.
>>
>> To make sure "host" is still at the end of the list in "-cpu
>> help", add a "ordering" field that will be used when sorting the
>> CPU model list.
>>
>> Cc: Richard Henderson <rth@twiddle.net>
>> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
> 
> I also had the same thing in mind when working on s390x models but
> decided to do it like x86. Now that x86 changes ...
> 
> Something like that should work for s390x (and I don't think it will break any concept). Most probably cleaner to handle this the same
> way on all architectures and to not disable tests for s390x.
> 
> Uncompiled and untested.
> 
> @Conny and Christian, feel free to pick up and modify if this makes
> sense
> 
Looks sane to me. Can you resend properly, it looks like whitespace
got damaged all over the place.

Thanks


> From 4a2af1ca47421b68eb7677cd91af350dd9be4e0e Mon Sep 17 00:00:00 2001
> From: David Hildenbrand <david@redhat.com>
> Date: Tue, 17 Jan 2017 18:34:45 +0100
> Subject: [PATCH] s390x/cpumodel: allow the "host" model also for tcg
> 
> Let's also allow the host model for tcg, therefore meaning
> "enable all features supported by the selected accelerator in the current
> host".
> 
> Signed-off-by: David Hildenbrand <david@redhat.com>
> ---
>  qapi-schema.json          |  4 ++--
>  target/s390x/cpu-qom.h    |  1 -
>  target/s390x/cpu_models.c | 34 ++++++++--------------------------
>  3 files changed, 10 insertions(+), 29 deletions(-)
> 
> diff --git a/qapi-schema.json b/qapi-schema.json
> index ddc8783..f14d343 100644
> --- a/qapi-schema.json
> +++ b/qapi-schema.json
> @@ -4334,8 +4334,8 @@
>  # CPU model has to be created by baselining.
>  #
>  # Usually, a CPU model is compared against the maximum possible CPU model
> -# of a certain configuration (e.g. the "host" model for KVM). If that CPU
> -# model is identical or a subset, it will run in that configuration.
> +# of a certain configuration (the "host" model). If that CPU model is
> +# identical or a subset, it will run in that configuration.
>  #
>  # The result returned by this command may be affected by:
>  #
> diff --git a/target/s390x/cpu-qom.h b/target/s390x/cpu-qom.h
> index 4e936e7..71322a5 100644
> --- a/target/s390x/cpu-qom.h
> +++ b/target/s390x/cpu-qom.h
> @@ -47,7 +47,6 @@ typedef struct S390CPUClass {
>      CPUClass parent_class;
>      /*< public >*/
>      const S390CPUDef *cpu_def;
> -    bool kvm_required;
>      bool is_static;
>      bool is_migration_safe;
>      const char *desc;
> diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c
> index 5b66d33..2994a7b 100644
> --- a/target/s390x/cpu_models.c
> +++ b/target/s390x/cpu_models.c
> @@ -331,10 +331,6 @@ static void cpu_model_from_info(S390CPUModel *model, const CpuModelInfo *info,
>          error_setg(errp, "The CPU definition \'%s\' is unknown.", info->name);
>          return;
>      }
> -    if (S390_CPU_CLASS(oc)->kvm_required && !kvm_enabled()) {
> -        error_setg(errp, "The CPU definition '%s' requires KVM", info->name);
> -        return;
> -    }
>      obj = object_new(object_class_get_name(oc));
>      cpu = S390_CPU(obj);
> 
> @@ -718,15 +714,9 @@ static inline void apply_cpu_model(const S390CPUModel *model, Error **errp)
> 
>  void s390_realize_cpu_model(CPUState *cs, Error **errp)
>  {
> -    S390CPUClass *xcc = S390_CPU_GET_CLASS(cs);
>      S390CPU *cpu = S390_CPU(cs);
>      const S390CPUModel *max_model;
> 
> -    if (xcc->kvm_required && !kvm_enabled()) {
> -        error_setg(errp, "CPU definition requires KVM");
> -        return;
> -    }
> -
>      if (!cpu->model) {
>          /* no host model support -> perform compatibility stuff */
>          apply_cpu_model(NULL, errp);
> @@ -904,26 +894,25 @@ static void s390_cpu_model_initfn(Object *obj)
>      }
>  }
> 
> -#ifdef CONFIG_KVM
>  static void s390_host_cpu_model_initfn(Object *obj)
>  {
> +    S390CPUModel *max_model;
>      S390CPU *cpu = S390_CPU(obj);
>      Error *err = NULL;
> 
> -    if (!kvm_enabled() || !kvm_s390_cpu_models_supported()) {
> +    if (kvm_enabled() && !kvm_s390_cpu_models_supported()) {
>          return;
>      }
> 
> -    cpu->model = g_malloc0(sizeof(*cpu->model));
> -    kvm_s390_get_host_cpu_model(cpu->model, &err);
> -    if (err) {
> +    max_model = get_max_cpu_model(&err);
> +    if (err || !max_model) {
>          error_report_err(err);
> -        g_free(cpu->model);
>          /* fallback to unsupported cpu models */
> -        cpu->model = NULL;
> +        return;
>      }
> +    /* copy the host model so it can be modified */
> +    cpu->model = g_memdup(max_model, sizeof(*cpu->model));
>  }
> -#endif
> 
>  static void s390_qemu_cpu_model_initfn(Object *obj)
>  {
> @@ -969,15 +958,12 @@ void s390_cpu_model_class_register_props(ObjectClass *oc)
>                                    NULL);
>  }
> 
> -#ifdef CONFIG_KVM
>  static void s390_host_cpu_model_class_init(ObjectClass *oc, void *data)
>  {
>      S390CPUClass *xcc = S390_CPU_CLASS(oc);
> 
> -    xcc->kvm_required = true;
> -    xcc->desc = "KVM only: All recognized features";
> +    xcc->desc = "All supported and available features";
>  }
> -#endif
> 
>  static void s390_base_cpu_model_class_init(ObjectClass *oc, void *data)
>  {
> @@ -1042,7 +1028,6 @@ static const TypeInfo qemu_s390_cpu_type_info = {
>      .class_init = s390_qemu_cpu_model_class_init,
>  };
> 
> -#ifdef CONFIG_KVM
>  static const TypeInfo host_s390_cpu_type_info = {
>      .name = S390_CPU_TYPE_NAME("host"),
>      .parent = TYPE_S390_CPU,
> @@ -1050,7 +1035,6 @@ static const TypeInfo host_s390_cpu_type_info = {
>      .instance_finalize = s390_cpu_model_finalize,
>      .class_init = s390_host_cpu_model_class_init,
>  };
> -#endif
> 
>  static void register_types(void)
>  {
> @@ -1093,9 +1077,7 @@ static void register_types(void)
>      }
> 
>      type_register_static(&qemu_s390_cpu_type_info);
> -#ifdef CONFIG_KVM
>      type_register_static(&host_s390_cpu_type_info);
> -#endif
>  }
> 
>  type_init(register_types)
Christian Borntraeger Feb. 16, 2017, 2:44 p.m. UTC | #3
On 02/16/2017 03:43 PM, Christian Borntraeger wrote:
> On 01/17/2017 06:43 PM, David Hildenbrand wrote:
>> Am 16.01.2017 um 20:54 schrieb Eduardo Habkost:
>>> Change the meaning of "-cpu host" to "enable all features
>>> supported by the accelerator in the current host", so that it can
>>> be used to enable/query all features supported by TCG.
>>>
>>> To make sure "host" is still at the end of the list in "-cpu
>>> help", add a "ordering" field that will be used when sorting the
>>> CPU model list.
>>>
>>> Cc: Richard Henderson <rth@twiddle.net>
>>> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
>>
>> I also had the same thing in mind when working on s390x models but
>> decided to do it like x86. Now that x86 changes ...
>>
>> Something like that should work for s390x (and I don't think it will break any concept). Most probably cleaner to handle this the same
>> way on all architectures and to not disable tests for s390x.
>>
>> Uncompiled and untested.
>>
>> @Conny and Christian, feel free to pick up and modify if this makes
>> sense
>>
> Looks sane to me. Can you resend properly, it looks like whitespace
> got damaged all over the place.
> 
> Thanks

Forget that. For some reason, the "max" cpu patch series did not reach my inbox :-/
Will look into that.
diff mbox

Patch

diff --git a/qapi-schema.json b/qapi-schema.json
index ddc8783..f14d343 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -4334,8 +4334,8 @@ 
  # CPU model has to be created by baselining.
  #
  # Usually, a CPU model is compared against the maximum possible CPU model
-# of a certain configuration (e.g. the "host" model for KVM). If that CPU
-# model is identical or a subset, it will run in that configuration.
+# of a certain configuration (the "host" model). If that CPU model is
+# identical or a subset, it will run in that configuration.
  #
  # The result returned by this command may be affected by:
  #
diff --git a/target/s390x/cpu-qom.h b/target/s390x/cpu-qom.h
index 4e936e7..71322a5 100644
--- a/target/s390x/cpu-qom.h
+++ b/target/s390x/cpu-qom.h
@@ -47,7 +47,6 @@  typedef struct S390CPUClass {
      CPUClass parent_class;
      /*< public >*/
      const S390CPUDef *cpu_def;
-    bool kvm_required;
      bool is_static;
      bool is_migration_safe;
      const char *desc;
diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c
index 5b66d33..2994a7b 100644
--- a/target/s390x/cpu_models.c
+++ b/target/s390x/cpu_models.c
@@ -331,10 +331,6 @@  static void cpu_model_from_info(S390CPUModel 
*model, const CpuModelInfo *info,
          error_setg(errp, "The CPU definition \'%s\' is unknown.", 
info->name);
          return;
      }
-    if (S390_CPU_CLASS(oc)->kvm_required && !kvm_enabled()) {
-        error_setg(errp, "The CPU definition '%s' requires KVM", 
info->name);
-        return;
-    }