Signed-off-by: Igor Mammedov <imamm...@redhat.com> --- replaced link set check removed in previous patch --- hw/ppc/spapr.c | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-)
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 6890a44..db33c29 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -2297,6 +2297,27 @@ void *spapr_populate_hotplug_cpu_dt(DeviceState *dev, CPUState *cs, return fdt; } +static void spapr_machine_device_pre_plug(HotplugHandler *hotplug_dev, + DeviceState *dev, Error **errp) +{ + sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(hotplug_dev); + sPAPRMachineState *spapr = SPAPR_MACHINE(hotplug_dev); + + if (object_dynamic_cast(OBJECT(dev), TYPE_SPAPR_CPU_CORE)) { + int core = object_property_get_int(OBJECT(dev), CPU_CORE_ID_PROP, + &error_abort); + + if (!smc->dr_cpu_enabled && dev->hotplugged) { + error_setg(errp, "CPU hotplug not supported for this machine"); + return; + } + if (spapr->cores[core]) { + error_setg(errp, "core %d is already present", core); + return; + } + } +} + static void spapr_machine_device_plug(HotplugHandler *hotplug_dev, DeviceState *dev, Error **errp) { @@ -2338,10 +2359,6 @@ static void spapr_machine_device_plug(HotplugHandler *hotplug_dev, spapr_memory_plug(hotplug_dev, dev, node, errp); } else if (object_dynamic_cast(OBJECT(dev), TYPE_SPAPR_CPU_CORE)) { - if (!smc->dr_cpu_enabled && dev->hotplugged) { - error_setg(errp, "CPU hotplug not supported for this machine"); - return; - } spapr_core_plug(hotplug_dev, dev, errp); } } @@ -2413,6 +2430,7 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data) mc->has_dynamic_sysbus = true; mc->pci_allow_0_address = true; mc->get_hotplug_handler = spapr_get_hotpug_handler; + hc->pre_plug = spapr_machine_device_pre_plug; hc->plug = spapr_machine_device_plug; hc->unplug = spapr_machine_device_unplug; mc->cpu_index_to_socket_id = spapr_cpu_index_to_socket_id; -- 1.8.3.1