On Thu, Feb 09, 2017 at 12:08:33PM +0100, Igor Mammedov wrote: > 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>
Reviewed-by: David Gibson <da...@gibson.dropbear.id.au> > --- > hw/i386/pc.c | 35 ++++++++++++++++++++++++----------- > 1 file changed, 24 insertions(+), 11 deletions(-) > > diff --git a/hw/i386/pc.c b/hw/i386/pc.c > index cf2bec4..a6cfc97 100644 > --- a/hw/i386/pc.c > +++ b/hw/i386/pc.c > @@ -1144,7 +1144,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) { > @@ -1179,14 +1181,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; > - machine->possible_cpus = g_malloc0(sizeof(CPUArchIdList) + > - sizeof(CPUArchId) * max_cpus); > - for (i = 0; i < max_cpus; i++) { > - machine->possible_cpus->cpus[i].arch_id = > x86_cpu_apic_id_from_index(i); > - machine->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,10 +2245,26 @@ static unsigned pc_cpu_index_to_socket_id(unsigned > cpu_index) > return topo.pkg_id; > } > > -static const CPUArchIdList *pc_possible_cpu_arch_ids(MachineState *machine) > +static const CPUArchIdList *pc_possible_cpu_arch_ids(MachineState *ms) > { > - assert(machine->possible_cpus); > - return machine->possible_cpus; > + int i; > + > + if (ms->possible_cpus) { > + /* > + * make sure that max_cpus hasn't changed since the first use, i.e. > + * -smp hasn't been parsed after it > + */ > + assert(ms->possible_cpus->len == max_cpus); > + return ms->possible_cpus; > + } > + > + ms->possible_cpus = g_malloc0(sizeof(CPUArchIdList) + > + sizeof(CPUArchId) * max_cpus); > + ms->possible_cpus->len = max_cpus; > + for (i = 0; i < ms->possible_cpus->len; i++) { > + ms->possible_cpus->cpus[i].arch_id = x86_cpu_apic_id_from_index(i); > + } > + return ms->possible_cpus; > } > > static HotpluggableCPUList *pc_query_hotpluggable_cpus(MachineState *machine) -- 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
signature.asc
Description: PGP signature