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