Message ID | 20200826105254.28496-17-kraxel@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | microvm: add acpi support | expand |
On Wed, Aug 26, 2020 at 12:52:50PM +0200, Gerd Hoffmann wrote: > 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> > --- > hw/i386/microvm.c | 42 ++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 42 insertions(+) Reviewed-by: Sergio Lopez <slp@redhat.com> > diff --git a/hw/i386/microvm.c b/hw/i386/microvm.c > index 9df15354ce0f..8de8ca864963 100644 > --- a/hw/i386/microvm.c > +++ b/hw/i386/microvm.c > @@ -320,6 +320,39 @@ static void microvm_fix_kernel_cmdline(MachineState *machine) > 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) > { > 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) > { > MachineClass *mc = MACHINE_CLASS(oc); > + HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc); > > mc->init = microvm_machine_state_init; > > @@ -524,6 +558,13 @@ static void microvm_class_init(ObjectClass *oc, void *data) > /* Machine class handlers */ > 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", > microvm_machine_get_pic, > microvm_machine_set_pic, > @@ -573,6 +614,7 @@ static const TypeInfo microvm_machine_info = { > .class_size = sizeof(MicrovmMachineClass), > .class_init = microvm_class_init, > .interfaces = (InterfaceInfo[]) { > + { TYPE_HOTPLUG_HANDLER }, > { } > }, > }; > -- > 2.27.0 >
diff --git a/hw/i386/microvm.c b/hw/i386/microvm.c index 9df15354ce0f..8de8ca864963 100644 --- a/hw/i386/microvm.c +++ b/hw/i386/microvm.c @@ -320,6 +320,39 @@ static void microvm_fix_kernel_cmdline(MachineState *machine) 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) { 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) { MachineClass *mc = MACHINE_CLASS(oc); + HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc); mc->init = microvm_machine_state_init; @@ -524,6 +558,13 @@ static void microvm_class_init(ObjectClass *oc, void *data) /* Machine class handlers */ 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", microvm_machine_get_pic, microvm_machine_set_pic, @@ -573,6 +614,7 @@ static const TypeInfo microvm_machine_info = { .class_size = sizeof(MicrovmMachineClass), .class_init = microvm_class_init, .interfaces = (InterfaceInfo[]) { + { TYPE_HOTPLUG_HANDLER }, { } }, };