mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-09 10:34:58 -06:00
spapr_cpu_core: introduce spapr_create_vcpu()
This moves some code out from spapr_cpu_core_realize() for clarity. No functional change. Signed-off-by: Greg Kurz <groug@kaod.org> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
9986ddec4c
commit
d9f0e34cb7
1 changed files with 45 additions and 28 deletions
|
@ -157,6 +157,49 @@ error:
|
||||||
error_propagate(errp, local_err);
|
error_propagate(errp, local_err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static PowerPCCPU *spapr_create_vcpu(sPAPRCPUCore *sc, int i, Error **errp)
|
||||||
|
{
|
||||||
|
sPAPRCPUCoreClass *scc = SPAPR_CPU_CORE_GET_CLASS(sc);
|
||||||
|
CPUCore *cc = CPU_CORE(sc);
|
||||||
|
Object *obj;
|
||||||
|
char *id;
|
||||||
|
CPUState *cs;
|
||||||
|
PowerPCCPU *cpu;
|
||||||
|
Error *local_err = NULL;
|
||||||
|
|
||||||
|
obj = object_new(scc->cpu_type);
|
||||||
|
|
||||||
|
cs = CPU(obj);
|
||||||
|
cpu = POWERPC_CPU(obj);
|
||||||
|
cs->cpu_index = cc->core_id + i;
|
||||||
|
spapr_set_vcpu_id(cpu, cs->cpu_index, &local_err);
|
||||||
|
if (local_err) {
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
cpu->node_id = sc->node_id;
|
||||||
|
|
||||||
|
id = g_strdup_printf("thread[%d]", i);
|
||||||
|
object_property_add_child(OBJECT(sc), id, obj, &local_err);
|
||||||
|
g_free(id);
|
||||||
|
if (local_err) {
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
object_unref(obj);
|
||||||
|
return cpu;
|
||||||
|
|
||||||
|
err:
|
||||||
|
object_unref(obj);
|
||||||
|
error_propagate(errp, local_err);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void spapr_delete_vcpu(PowerPCCPU *cpu)
|
||||||
|
{
|
||||||
|
object_unparent(OBJECT(cpu));
|
||||||
|
}
|
||||||
|
|
||||||
static void spapr_cpu_core_realize(DeviceState *dev, Error **errp)
|
static void spapr_cpu_core_realize(DeviceState *dev, Error **errp)
|
||||||
{
|
{
|
||||||
/* We don't use SPAPR_MACHINE() in order to exit gracefully if the user
|
/* We don't use SPAPR_MACHINE() in order to exit gracefully if the user
|
||||||
|
@ -166,10 +209,8 @@ static void spapr_cpu_core_realize(DeviceState *dev, Error **errp)
|
||||||
(sPAPRMachineState *) object_dynamic_cast(qdev_get_machine(),
|
(sPAPRMachineState *) object_dynamic_cast(qdev_get_machine(),
|
||||||
TYPE_SPAPR_MACHINE);
|
TYPE_SPAPR_MACHINE);
|
||||||
sPAPRCPUCore *sc = SPAPR_CPU_CORE(OBJECT(dev));
|
sPAPRCPUCore *sc = SPAPR_CPU_CORE(OBJECT(dev));
|
||||||
sPAPRCPUCoreClass *scc = SPAPR_CPU_CORE_GET_CLASS(OBJECT(dev));
|
|
||||||
CPUCore *cc = CPU_CORE(OBJECT(dev));
|
CPUCore *cc = CPU_CORE(OBJECT(dev));
|
||||||
Error *local_err = NULL;
|
Error *local_err = NULL;
|
||||||
Object *obj;
|
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
if (!spapr) {
|
if (!spapr) {
|
||||||
|
@ -179,33 +220,10 @@ static void spapr_cpu_core_realize(DeviceState *dev, Error **errp)
|
||||||
|
|
||||||
sc->threads = g_new(PowerPCCPU *, cc->nr_threads);
|
sc->threads = g_new(PowerPCCPU *, cc->nr_threads);
|
||||||
for (i = 0; i < cc->nr_threads; i++) {
|
for (i = 0; i < cc->nr_threads; i++) {
|
||||||
char *id;
|
sc->threads[i] = spapr_create_vcpu(sc, i, &local_err);
|
||||||
CPUState *cs;
|
|
||||||
PowerPCCPU *cpu;
|
|
||||||
|
|
||||||
obj = object_new(scc->cpu_type);
|
|
||||||
|
|
||||||
cs = CPU(obj);
|
|
||||||
cpu = sc->threads[i] = POWERPC_CPU(obj);
|
|
||||||
cs->cpu_index = cc->core_id + i;
|
|
||||||
spapr_set_vcpu_id(cpu, cs->cpu_index, &local_err);
|
|
||||||
if (local_err) {
|
if (local_err) {
|
||||||
object_unref(obj);
|
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Set NUMA node for the threads belonged to core */
|
|
||||||
cpu->node_id = sc->node_id;
|
|
||||||
|
|
||||||
id = g_strdup_printf("thread[%d]", i);
|
|
||||||
object_property_add_child(OBJECT(sc), id, obj, &local_err);
|
|
||||||
g_free(id);
|
|
||||||
if (local_err) {
|
|
||||||
object_unref(obj);
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
object_unref(obj);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (j = 0; j < cc->nr_threads; j++) {
|
for (j = 0; j < cc->nr_threads; j++) {
|
||||||
|
@ -222,8 +240,7 @@ err_unrealize:
|
||||||
}
|
}
|
||||||
err:
|
err:
|
||||||
while (--i >= 0) {
|
while (--i >= 0) {
|
||||||
obj = OBJECT(sc->threads[i]);
|
spapr_delete_vcpu(sc->threads[i]);
|
||||||
object_unparent(obj);
|
|
||||||
}
|
}
|
||||||
g_free(sc->threads);
|
g_free(sc->threads);
|
||||||
error_propagate(errp, local_err);
|
error_propagate(errp, local_err);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue