On Tue, 7 Jul 2020 14:53:52 +0200 Gerd Hoffmann <kra...@redhat.com> 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 <kra...@redhat.com> Blame is on me for calling it hotplug, HotplugHandlerClass is basically a set of hooks to wire things up regardless if it's hotplug or coldplug. In hindsight it was obvious at the time it was introduced. Reviewed-by: Igor Mammedov <imamm...@redhat.com> > --- > hw/i386/microvm.c | 42 ++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 42 insertions(+) > > diff --git a/hw/i386/microvm.c b/hw/i386/microvm.c > index 3d8a66cfc3ac..a5b16b728f9f 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; > > @@ -523,6 +557,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, > @@ -572,6 +613,7 @@ static const TypeInfo microvm_machine_info = { > .class_size = sizeof(MicrovmMachineClass), > .class_init = microvm_class_init, > .interfaces = (InterfaceInfo[]) { > + { TYPE_HOTPLUG_HANDLER }, > { } > }, > };