diff mbox

[2/7] pc: move pcms->possible_cpus init out of pc_cpus_init()

Message ID 1486638518-171446-3-git-send-email-imammedo@redhat.com
State New
Headers show

Commit Message

Igor Mammedov Feb. 9, 2017, 11:08 a.m. UTC
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 <imammedo@redhat.com>
---
 hw/i386/pc.c | 35 ++++++++++++++++++++++++-----------
 1 file changed, 24 insertions(+), 11 deletions(-)

Comments

David Gibson Feb. 9, 2017, 11:26 p.m. UTC | #1
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 <imammedo@redhat.com>

Reviewed-by: David Gibson <david@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)
diff mbox

Patch

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)