[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC 05/13] pc: move pcms->possible_cpus init out of pc_cpu
From: |
Igor Mammedov |
Subject: |
[Qemu-devel] [RFC 05/13] pc: move pcms->possible_cpus init out of pc_cpus_init() |
Date: |
Wed, 18 Jan 2017 18:13:21 +0100 |
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 <address@hidden>
---
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
- [Qemu-devel] [RFC 00/13] numa: add '-numa cpu' option, Igor Mammedov, 2017/01/18
- [Qemu-devel] [RFC 01/13] numa: access CPU's node id via property in hmp_info_numa(), Igor Mammedov, 2017/01/18
- [Qemu-devel] [RFC 02/13] pc: cleanup: move smbios_set_cpuid() into pc_build_smbios(), Igor Mammedov, 2017/01/18
- [Qemu-devel] [RFC 03/13] pc: don't return cpu pointer from pc_new_cpu() as it's not needed anymore, Igor Mammedov, 2017/01/18
- [Qemu-devel] [RFC 04/13] make possible_cpu_arch_ids() return const pointer, Igor Mammedov, 2017/01/18
- [Qemu-devel] [RFC 05/13] pc: move pcms->possible_cpus init out of pc_cpus_init(),
Igor Mammedov <=
- [Qemu-devel] [RFC 06/13] pc: calculate topology only once when possible_cpus is initialised, Igor Mammedov, 2017/01/18
- [Qemu-devel] [RFC 08/13] pc: add writeonly 'cpu' property to PCMachine, Igor Mammedov, 2017/01/18