it will allow generic numa code to set cpu to numa node mapping in target independent manner in the next patch.
Signed-off-by: Igor Mammedov <imamm...@redhat.com> --- hw/i386/pc.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/hw/i386/pc.c b/hw/i386/pc.c index f8ea635..1d33a5e 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -2201,6 +2201,56 @@ static void pc_machine_set_pit(Object *obj, bool value, Error **errp) pcms->pit = value; } +static void pc_machine_set_cpu(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + uint32_t apic_id; + X86CPUTopoInfo topo; + CPUArchId *cpu_slot; + Error *local_err = NULL; + CpuInstanceProperties *cpu_props = NULL; + PCMachineState *pcms = PC_MACHINE(obj); + MachineClass *mc = MACHINE_GET_CLASS(obj); + + visit_type_CpuInstanceProperties(v, name, &cpu_props, &local_err); + if (local_err) { + goto out; + } + + if (!cpu_props->has_node_id) { + error_setg(&local_err, "node-id property is not specified"); + goto out; + } + + /* + * make sure that possible_cpus is initialized + * as property setter might be called before machine init is called + */ + mc->possible_cpu_arch_ids(MACHINE(obj)); + + topo.pkg_id = cpu_props->socket_id; + topo.core_id = cpu_props->core_id; + topo.smt_id = cpu_props->thread_id; + apic_id = apicid_from_topo_ids(smp_cores, smp_threads, &topo); + cpu_slot = pc_find_cpu_slot(pcms, apic_id, NULL); + if (!cpu_slot) { + error_setg(&local_err, "unable to find CPU"); + goto out; + } + + if (cpu_slot->props.has_node_id) { + error_setg(&local_err, "CPU has already been assigned to node: %"PRId64, + cpu_slot->props.node_id); + goto out; + } + cpu_slot->props.has_node_id = true; + cpu_slot->props.node_id = cpu_props->node_id; + + out: + error_propagate(errp, local_err); + qapi_free_CpuInstanceProperties(cpu_props); +} + static void pc_machine_initfn(Object *obj) { PCMachineState *pcms = PC_MACHINE(obj); @@ -2395,6 +2445,12 @@ static void pc_machine_class_init(ObjectClass *oc, void *data) object_class_property_add_bool(oc, PC_MACHINE_PIT, pc_machine_get_pit, pc_machine_set_pit, &error_abort); + + object_class_property_add(oc, "cpu", "CpuInstanceProperties", + NULL, pc_machine_set_cpu, + NULL, NULL, &error_abort); + object_class_property_set_description(oc, "cpu", + "Possible cpu placement", &error_abort); } static const TypeInfo pc_machine_info = { -- 2.7.4