microvm: wire up hotplug
The cpu hotplug code handles the initialization of coldplugged cpus too, so it is needed even in case cpu hotplug is not supported. Wire cpu hotplug up for microvm. Without this we get a broken MADT table. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Reviewed-by: Igor Mammedov <imammedo@redhat.com> Reviewed-by: Sergio Lopez <slp@redhat.com> Message-id: 20200915120909.20838-17-kraxel@redhat.com
This commit is contained in:
parent
0cca1a918b
commit
e3ab9873d2
@ -320,6 +320,39 @@ static void microvm_fix_kernel_cmdline(MachineState *machine)
|
|||||||
g_free(cmdline);
|
g_free(cmdline);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void microvm_device_pre_plug_cb(HotplugHandler *hotplug_dev,
|
||||||
|
DeviceState *dev, Error **errp)
|
||||||
|
{
|
||||||
|
x86_cpu_pre_plug(hotplug_dev, dev, errp);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void microvm_device_plug_cb(HotplugHandler *hotplug_dev,
|
||||||
|
DeviceState *dev, Error **errp)
|
||||||
|
{
|
||||||
|
x86_cpu_plug(hotplug_dev, dev, errp);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void microvm_device_unplug_request_cb(HotplugHandler *hotplug_dev,
|
||||||
|
DeviceState *dev, Error **errp)
|
||||||
|
{
|
||||||
|
error_setg(errp, "unplug not supported by microvm");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void microvm_device_unplug_cb(HotplugHandler *hotplug_dev,
|
||||||
|
DeviceState *dev, Error **errp)
|
||||||
|
{
|
||||||
|
error_setg(errp, "unplug not supported by microvm");
|
||||||
|
}
|
||||||
|
|
||||||
|
static HotplugHandler *microvm_get_hotplug_handler(MachineState *machine,
|
||||||
|
DeviceState *dev)
|
||||||
|
{
|
||||||
|
if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) {
|
||||||
|
return HOTPLUG_HANDLER(machine);
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static void microvm_machine_state_init(MachineState *machine)
|
static void microvm_machine_state_init(MachineState *machine)
|
||||||
{
|
{
|
||||||
MicrovmMachineState *mms = MICROVM_MACHINE(machine);
|
MicrovmMachineState *mms = MICROVM_MACHINE(machine);
|
||||||
@ -503,6 +536,7 @@ static void microvm_machine_initfn(Object *obj)
|
|||||||
static void microvm_class_init(ObjectClass *oc, void *data)
|
static void microvm_class_init(ObjectClass *oc, void *data)
|
||||||
{
|
{
|
||||||
MachineClass *mc = MACHINE_CLASS(oc);
|
MachineClass *mc = MACHINE_CLASS(oc);
|
||||||
|
HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc);
|
||||||
|
|
||||||
mc->init = microvm_machine_state_init;
|
mc->init = microvm_machine_state_init;
|
||||||
|
|
||||||
@ -524,6 +558,13 @@ static void microvm_class_init(ObjectClass *oc, void *data)
|
|||||||
/* Machine class handlers */
|
/* Machine class handlers */
|
||||||
mc->reset = microvm_machine_reset;
|
mc->reset = microvm_machine_reset;
|
||||||
|
|
||||||
|
/* hotplug (for cpu coldplug) */
|
||||||
|
mc->get_hotplug_handler = microvm_get_hotplug_handler;
|
||||||
|
hc->pre_plug = microvm_device_pre_plug_cb;
|
||||||
|
hc->plug = microvm_device_plug_cb;
|
||||||
|
hc->unplug_request = microvm_device_unplug_request_cb;
|
||||||
|
hc->unplug = microvm_device_unplug_cb;
|
||||||
|
|
||||||
object_class_property_add(oc, MICROVM_MACHINE_PIC, "OnOffAuto",
|
object_class_property_add(oc, MICROVM_MACHINE_PIC, "OnOffAuto",
|
||||||
microvm_machine_get_pic,
|
microvm_machine_get_pic,
|
||||||
microvm_machine_set_pic,
|
microvm_machine_set_pic,
|
||||||
@ -573,6 +614,7 @@ static const TypeInfo microvm_machine_info = {
|
|||||||
.class_size = sizeof(MicrovmMachineClass),
|
.class_size = sizeof(MicrovmMachineClass),
|
||||||
.class_init = microvm_class_init,
|
.class_init = microvm_class_init,
|
||||||
.interfaces = (InterfaceInfo[]) {
|
.interfaces = (InterfaceInfo[]) {
|
||||||
|
{ TYPE_HOTPLUG_HANDLER },
|
||||||
{ }
|
{ }
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user