diff options
Diffstat (limited to 'hw')
-rw-r--r-- | hw/ppc/spapr_cpu_core.c | 27 |
1 files changed, 9 insertions, 18 deletions
diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c index c04aaa47d7..ec81ee6088 100644 --- a/hw/ppc/spapr_cpu_core.c +++ b/hw/ppc/spapr_cpu_core.c @@ -125,7 +125,6 @@ static void spapr_core_release(DeviceState *dev, void *opaque) void spapr_core_unplug(HotplugHandler *hotplug_dev, DeviceState *dev, Error **errp) { - sPAPRMachineState *spapr = SPAPR_MACHINE(OBJECT(hotplug_dev)); CPUCore *cc = CPU_CORE(dev); int smt = kvmppc_smt_threads(); int index = cc->core_id / smp_threads; @@ -133,16 +132,12 @@ void spapr_core_unplug(HotplugHandler *hotplug_dev, DeviceState *dev, spapr_dr_connector_by_id(SPAPR_DR_CONNECTOR_TYPE_CPU, index * smt); sPAPRDRConnectorClass *drck; Error *local_err = NULL; - int spapr_max_cores = max_cpus / smp_threads; - int i; - for (i = spapr_max_cores - 1; i > index; i--) { - if (spapr->cores[i]) { - error_setg(errp, "core-id %d should be removed first", - i * smp_threads); - return; - } + if (index == 0) { + error_setg(errp, "Boot CPU core may not be unplugged"); + return; } + g_assert(drc); drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc); @@ -224,7 +219,7 @@ void spapr_core_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev, sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(OBJECT(hotplug_dev)); sPAPRMachineState *spapr = SPAPR_MACHINE(OBJECT(hotplug_dev)); int spapr_max_cores = max_cpus / smp_threads; - int index, i; + int index; Error *local_err = NULL; CPUCore *cc = CPU_CORE(dev); char *base_core_type = spapr_get_cpu_core_type(machine->cpu_model); @@ -261,14 +256,6 @@ void spapr_core_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev, goto out; } - for (i = 0; i < index; i++) { - if (!spapr->cores[i]) { - error_setg(&local_err, "core-id %d should be added first", - i * smp_threads); - goto out; - } - } - out: g_free(base_core_type); error_propagate(errp, local_err); @@ -307,9 +294,13 @@ static void spapr_cpu_core_realize(DeviceState *dev, Error **errp) sc->threads = g_malloc0(size * cc->nr_threads); for (i = 0; i < cc->nr_threads; i++) { char id[32]; + CPUState *cs; + obj = sc->threads + i * size; object_initialize(obj, size, typename); + cs = CPU(obj); + cs->cpu_index = cc->core_id + i; snprintf(id, sizeof(id), "thread[%d]", i); object_property_add_child(OBJECT(sc), id, obj, &local_err); if (local_err) { |