[v5,22/22] s390x: allow CPU hotplug in random core-id order

Message ID 20170913132417.24384-23-david@redhat.com
State New
Headers show
Series
  • s390x cleanups and CPU hotplug via device_add
Related show

Commit Message

David Hildenbrand Sept. 13, 2017, 1:24 p.m.
SCLP correctly indicates the core-id aka. CPU address for each available
CPU.

As the core-id corresponds to cpu_index, also a newly created kvm vcpu
gets assigned this core-id as vcpu id. So SIGP in the kernel works
correctly (it uses the vcpu id to lookup the correct CPU).

So there should be nothing hindering us from hotplugging CPUs in random
core-id order.

This now makes sure that the output from "query-hotpluggable-cpus"
is completely true. Until now, a specific order is implicit. Performance
vice, hotplugging CPUs in non-sequential order might not be the best thing
to do, as VCPU lookup inside KVM might be a little slower. But that
doesn't hinder us from supporting it.

next_core_id is now used by linux user only.

Signed-off-by: David Hildenbrand <david@redhat.com>
---
 target/s390x/cpu.c | 8 +-------
 1 file changed, 1 insertion(+), 7 deletions(-)

Comments

Igor Mammedov Sept. 13, 2017, 2:46 p.m. | #1
On Wed, 13 Sep 2017 15:24:17 +0200
David Hildenbrand <david@redhat.com> wrote:

> SCLP correctly indicates the core-id aka. CPU address for each available
> CPU.
> 
> As the core-id corresponds to cpu_index, also a newly created kvm vcpu
> gets assigned this core-id as vcpu id. So SIGP in the kernel works
> correctly (it uses the vcpu id to lookup the correct CPU).
> 
> So there should be nothing hindering us from hotplugging CPUs in random
> core-id order.
> 
> This now makes sure that the output from "query-hotpluggable-cpus"
> is completely true. Until now, a specific order is implicit. Performance
> vice, hotplugging CPUs in non-sequential order might not be the best thing
> to do, as VCPU lookup inside KVM might be a little slower. But that
> doesn't hinder us from supporting it.
> 
> next_core_id is now used by linux user only.
> 
> Signed-off-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Igor Mammedov <imammedo@redhat.com>

> ---
>  target/s390x/cpu.c | 8 +-------
>  1 file changed, 1 insertion(+), 7 deletions(-)
> 
> diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c
> index 5724dffb88..34538c3ab9 100644
> --- a/target/s390x/cpu.c
> +++ b/target/s390x/cpu.c
> @@ -199,6 +199,7 @@ static void s390_cpu_realizefn(DeviceState *dev, Error **errp)
>  #else
>      /* implicitly set for linux-user only */
>      cpu->env.core_id = scc->next_core_id;
> +    scc->next_core_id++;
>  #endif
>  
>      if (cpu_exists(cpu->env.core_id)) {
> @@ -206,12 +207,6 @@ static void s390_cpu_realizefn(DeviceState *dev, Error **errp)
>                     ", it already exists", cpu->env.core_id);
>          goto out;
>      }
> -    if (cpu->env.core_id != scc->next_core_id) {
> -        error_setg(&err, "Unable to add CPU with core-id: %" PRIu32
> -                   ", the next available core-id is %" PRIu32, cpu->env.core_id,
> -                   scc->next_core_id);
> -        goto out;
> -    }
>  
>      /* sync cs->cpu_index and env->core_id. The latter is needed for TCG. */
>      cs->cpu_index = env->core_id;
> @@ -219,7 +214,6 @@ static void s390_cpu_realizefn(DeviceState *dev, Error **errp)
>      if (err != NULL) {
>          goto out;
>      }
> -    scc->next_core_id++;
>  
>  #if !defined(CONFIG_USER_ONLY)
>      qemu_register_reset(s390_cpu_machine_reset_cb, cpu);

Patch

diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c
index 5724dffb88..34538c3ab9 100644
--- a/target/s390x/cpu.c
+++ b/target/s390x/cpu.c
@@ -199,6 +199,7 @@  static void s390_cpu_realizefn(DeviceState *dev, Error **errp)
 #else
     /* implicitly set for linux-user only */
     cpu->env.core_id = scc->next_core_id;
+    scc->next_core_id++;
 #endif
 
     if (cpu_exists(cpu->env.core_id)) {
@@ -206,12 +207,6 @@  static void s390_cpu_realizefn(DeviceState *dev, Error **errp)
                    ", it already exists", cpu->env.core_id);
         goto out;
     }
-    if (cpu->env.core_id != scc->next_core_id) {
-        error_setg(&err, "Unable to add CPU with core-id: %" PRIu32
-                   ", the next available core-id is %" PRIu32, cpu->env.core_id,
-                   scc->next_core_id);
-        goto out;
-    }
 
     /* sync cs->cpu_index and env->core_id. The latter is needed for TCG. */
     cs->cpu_index = env->core_id;
@@ -219,7 +214,6 @@  static void s390_cpu_realizefn(DeviceState *dev, Error **errp)
     if (err != NULL) {
         goto out;
     }
-    scc->next_core_id++;
 
 #if !defined(CONFIG_USER_ONLY)
     qemu_register_reset(s390_cpu_machine_reset_cb, cpu);