diff mbox

[RFC,05/13] pc: move pcms->possible_cpus init out of pc_cpus_init()

Message ID 1484759609-264075-6-git-send-email-imammedo@redhat.com
State New
Headers show

Commit Message

Igor Mammedov Jan. 18, 2017, 5:13 p.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 | 29 ++++++++++++++++++++---------
 1 file changed, 20 insertions(+), 9 deletions(-)

Comments

Dou Liyang Jan. 20, 2017, 3:31 a.m. UTC | #1
At 01/19/2017 01:13 AM, Igor Mammedov wrote:
> possible_cpus could be initialized earlier then cpu objects,

s/then/than/

> i.e. when -smp is parsed so move init code to possible_cpu_arch_ids()

[...]
Igor Mammedov Jan. 20, 2017, 3:33 p.m. UTC | #2
On Fri, 20 Jan 2017 11:31:56 +0800
Dou Liyang <douly.fnst@cn.fujitsu.com> wrote:

> At 01/19/2017 01:13 AM, Igor Mammedov wrote:
> > possible_cpus could be initialized earlier then cpu objects,  
> 
> s/then/than/
ok,
I'll fix it on respin

> 
> > i.e. when -smp is parsed so move init code to possible_cpu_arch_ids()  
> 
> [...]
> 
> 
>
diff mbox

Patch

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