Message ID | 1455854617-30964-6-git-send-email-mjrosato@linux.vnet.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Thu, 18 Feb 2016 23:03:36 -0500 Matthew Rosato <mjrosato@linux.vnet.ibm.com> wrote: > First consumer will be CPU hotplug, to update machine/cpu[n] > links during cpu plug. > > Signed-off-by: Matthew Rosato <mjrosato@linux.vnet.ibm.com> > --- > hw/s390x/s390-virtio-ccw.c | 40 ++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 40 insertions(+) > > diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c > index b05ed8b..31c1082 100644 > --- a/hw/s390x/s390-virtio-ccw.c > +++ b/hw/s390x/s390-virtio-ccw.c > @@ -156,10 +156,46 @@ static void ccw_init(MachineState *machine) > gtod_save, gtod_load, kvm_state); > } > > +static void s390_cpu_plug(HotplugHandler *hotplug_dev, > + DeviceState *dev, Error **errp) > +{ > + gchar *name; > + S390CPU *cpu = S390_CPU(dev); > + CPUState *cs = CPU(dev); > + > + name = g_strdup_printf("cpu[%i]", cpu->env.cpu_num); > + object_property_set_link(OBJECT(qdev_get_machine()), OBJECT(cs), name, > + errp); > +} > + > +static void s390_machine_device_plug(HotplugHandler *hotplug_dev, > + DeviceState *dev, Error **errp) > +{ > + if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) { > + s390_cpu_plug(hotplug_dev, dev, errp); > + } > +} > + > +static void s390_machine_device_unplug(HotplugHandler *hotplug_dev, > + DeviceState *dev, Error **errp) > +{ > + > +} > + > +static HotplugHandler *s390_get_hotplug_handler(MachineState *machine, > + DeviceState *dev) > +{ > + if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) { > + return HOTPLUG_HANDLER(machine); > + } > + return NULL; > +} > + > static void ccw_machine_class_init(ObjectClass *oc, void *data) > { > MachineClass *mc = MACHINE_CLASS(oc); > NMIClass *nc = NMI_CLASS(oc); > + HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc); > > mc->init = ccw_init; > mc->reset = s390_machine_reset; > @@ -171,6 +207,9 @@ static void ccw_machine_class_init(ObjectClass *oc, void *data) > mc->no_sdcard = 1; > mc->use_sclp = 1; > mc->max_cpus = 255; > + mc->get_hotplug_handler = s390_get_hotplug_handler; > + hc->plug = s390_machine_device_plug; > + hc->unplug = s390_machine_device_unplug; drop unplug handler as does nothing, if it's NULL then generic qdev code will ignore it, see qdev_unplug(). > nc->nmi_monitor_handler = s390_nmi; > } > > @@ -232,6 +271,7 @@ static const TypeInfo ccw_machine_info = { > .class_init = ccw_machine_class_init, > .interfaces = (InterfaceInfo[]) { > { TYPE_NMI }, > + { TYPE_HOTPLUG_HANDLER}, > { } > }, > };
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c index b05ed8b..31c1082 100644 --- a/hw/s390x/s390-virtio-ccw.c +++ b/hw/s390x/s390-virtio-ccw.c @@ -156,10 +156,46 @@ static void ccw_init(MachineState *machine) gtod_save, gtod_load, kvm_state); } +static void s390_cpu_plug(HotplugHandler *hotplug_dev, + DeviceState *dev, Error **errp) +{ + gchar *name; + S390CPU *cpu = S390_CPU(dev); + CPUState *cs = CPU(dev); + + name = g_strdup_printf("cpu[%i]", cpu->env.cpu_num); + object_property_set_link(OBJECT(qdev_get_machine()), OBJECT(cs), name, + errp); +} + +static void s390_machine_device_plug(HotplugHandler *hotplug_dev, + DeviceState *dev, Error **errp) +{ + if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) { + s390_cpu_plug(hotplug_dev, dev, errp); + } +} + +static void s390_machine_device_unplug(HotplugHandler *hotplug_dev, + DeviceState *dev, Error **errp) +{ + +} + +static HotplugHandler *s390_get_hotplug_handler(MachineState *machine, + DeviceState *dev) +{ + if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) { + return HOTPLUG_HANDLER(machine); + } + return NULL; +} + static void ccw_machine_class_init(ObjectClass *oc, void *data) { MachineClass *mc = MACHINE_CLASS(oc); NMIClass *nc = NMI_CLASS(oc); + HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc); mc->init = ccw_init; mc->reset = s390_machine_reset; @@ -171,6 +207,9 @@ static void ccw_machine_class_init(ObjectClass *oc, void *data) mc->no_sdcard = 1; mc->use_sclp = 1; mc->max_cpus = 255; + mc->get_hotplug_handler = s390_get_hotplug_handler; + hc->plug = s390_machine_device_plug; + hc->unplug = s390_machine_device_unplug; nc->nmi_monitor_handler = s390_nmi; } @@ -232,6 +271,7 @@ static const TypeInfo ccw_machine_info = { .class_init = ccw_machine_class_init, .interfaces = (InterfaceInfo[]) { { TYPE_NMI }, + { TYPE_HOTPLUG_HANDLER}, { } }, };
First consumer will be CPU hotplug, to update machine/cpu[n] links during cpu plug. Signed-off-by: Matthew Rosato <mjrosato@linux.vnet.ibm.com> --- hw/s390x/s390-virtio-ccw.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+)