possible_cpus could be initialized earlier then cpu objects, i.e. when -smp is parsed so move init code to possible_cpu_arch_ids() interface func and do initialization on the first call.
it should help later with making -numa cpu/-smp parsing a machine state properties. Signed-off-by: Igor Mammedov <imamm...@redhat.com> --- hw/i386/pc.c | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/hw/i386/pc.c b/hw/i386/pc.c index a2ab7fb..7ec5304 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -1143,7 +1143,9 @@ void pc_cpus_init(PCMachineState *pcms) ObjectClass *oc; const char *typename; gchar **model_pieces; + const CPUArchIdList *possible_cpus; MachineState *machine = MACHINE(pcms); + MachineClass *mc = MACHINE_GET_CLASS(pcms); /* init CPUs */ if (machine->cpu_model == NULL) { @@ -1178,14 +1180,9 @@ void pc_cpus_init(PCMachineState *pcms) * This is used for FW_CFG_MAX_CPUS. See comments on bochs_bios_init(). */ pcms->apic_id_limit = x86_cpu_apic_id_from_index(max_cpus - 1) + 1; - pcms->possible_cpus = g_malloc0(sizeof(CPUArchIdList) + - sizeof(CPUArchId) * max_cpus); - for (i = 0; i < max_cpus; i++) { - pcms->possible_cpus->cpus[i].arch_id = x86_cpu_apic_id_from_index(i); - pcms->possible_cpus->len++; - if (i < smp_cpus) { - pc_new_cpu(typename, x86_cpu_apic_id_from_index(i), &error_fatal); - } + possible_cpus = mc->possible_cpu_arch_ids(machine); + for (i = 0; i < smp_cpus; i++) { + pc_new_cpu(typename, possible_cpus->cpus[i].arch_id, &error_fatal); } } @@ -2248,7 +2245,21 @@ static unsigned pc_cpu_index_to_socket_id(unsigned cpu_index) static const CPUArchIdList *pc_possible_cpu_arch_ids(MachineState *machine) { PCMachineState *pcms = PC_MACHINE(machine); - assert(pcms->possible_cpus); + if (!pcms->possible_cpus) { + int i; + CPUArchIdList *possible_cpus = g_malloc0(sizeof(CPUArchIdList) + + sizeof(CPUArchId) * max_cpus); + possible_cpus->len = max_cpus; + for (i = 0; i < max_cpus; i++) { + possible_cpus->cpus[i].arch_id = x86_cpu_apic_id_from_index(i); + } + pcms->possible_cpus = possible_cpus; + } + /* + * make sure that max_cpus hasn't changed since the first use, i.e. + * -smp hasn't been parsed after it + */ + assert(pcms->possible_cpus->len == max_cpus); return pcms->possible_cpus; } -- 2.7.4