From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:37899) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XeEyD-0006Lb-P0 for qemu-devel@nongnu.org; Tue, 14 Oct 2014 23:09:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XeEy2-0004vK-26 for qemu-devel@nongnu.org; Tue, 14 Oct 2014 23:09:49 -0400 Received: from cantor2.suse.de ([195.135.220.15]:49357 helo=mx2.suse.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XeEy1-0004r4-Ma for qemu-devel@nongnu.org; Tue, 14 Oct 2014 23:09:37 -0400 From: =?UTF-8?q?Andreas=20F=C3=A4rber?= Date: Wed, 15 Oct 2014 05:09:15 +0200 Message-Id: <1413342561-4754-42-git-send-email-afaerber@suse.de> In-Reply-To: <1413342561-4754-1-git-send-email-afaerber@suse.de> References: <1413342561-4754-1-git-send-email-afaerber@suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PULL 41/47] qdev: HotplugHandler: Add support for unplugging BUS-less devices List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Igor Mammedov , =?UTF-8?q?Andreas=20F=C3=A4rber?= From: Igor Mammedov Signed-off-by: Igor Mammedov Signed-off-by: Andreas F=C3=A4rber --- hw/core/qdev.c | 61 ++++++++++++++++++++++++++++++++--------------------= ------ 1 file changed, 34 insertions(+), 27 deletions(-) diff --git a/hw/core/qdev.c b/hw/core/qdev.c index 3e58dd0..7685e07 100644 --- a/hw/core/qdev.c +++ b/hw/core/qdev.c @@ -223,9 +223,28 @@ void qdev_set_legacy_instance_id(DeviceState *dev, i= nt alias_id, dev->alias_required_for_version =3D required_for_version; } =20 +static HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev) +{ + HotplugHandler *hotplug_ctrl =3D NULL; + + if (dev->parent_bus && dev->parent_bus->hotplug_handler) { + hotplug_ctrl =3D dev->parent_bus->hotplug_handler; + } else if (object_dynamic_cast(qdev_get_machine(), TYPE_MACHINE)) { + MachineState *machine =3D MACHINE(qdev_get_machine()); + MachineClass *mc =3D MACHINE_GET_CLASS(machine); + + if (mc->get_hotplug_handler) { + hotplug_ctrl =3D mc->get_hotplug_handler(machine, dev); + } + } + return hotplug_ctrl; +} + void qdev_unplug(DeviceState *dev, Error **errp) { DeviceClass *dc =3D DEVICE_GET_CLASS(dev); + HotplugHandler *hotplug_ctrl; + HotplugHandlerClass *hdc; =20 if (dev->parent_bus && !qbus_is_hotpluggable(dev->parent_bus)) { error_set(errp, QERR_BUS_NO_HOTPLUG, dev->parent_bus->name); @@ -240,20 +259,18 @@ void qdev_unplug(DeviceState *dev, Error **errp) =20 qdev_hot_removed =3D true; =20 - if (dev->parent_bus && dev->parent_bus->hotplug_handler) { - HotplugHandlerClass *hdc; - - /* If device supports async unplug just request it to be done, - * otherwise just remove it synchronously */ - hdc =3D HOTPLUG_HANDLER_GET_CLASS(dev->parent_bus->hotplug_handl= er); - if (hdc->unplug_request) { - hotplug_handler_unplug_request(dev->parent_bus->hotplug_hand= ler, - dev, errp); - } else { - hotplug_handler_unplug(dev->parent_bus->hotplug_handler, dev= , errp); - } + hotplug_ctrl =3D qdev_get_hotplug_handler(dev); + /* hotpluggable device MUST have HotplugHandler, if it doesn't + * then something is very wrong with it */ + g_assert(hotplug_ctrl); + + /* If device supports async unplug just request it to be done, + * otherwise just remove it synchronously */ + hdc =3D HOTPLUG_HANDLER_GET_CLASS(hotplug_ctrl); + if (hdc->unplug_request) { + hotplug_handler_unplug_request(hotplug_ctrl, dev, errp); } else { - assert(0); + hotplug_handler_unplug(hotplug_ctrl, dev, errp); } } =20 @@ -854,6 +871,7 @@ static void device_set_realized(Object *obj, bool val= ue, Error **errp) { DeviceState *dev =3D DEVICE(obj); DeviceClass *dc =3D DEVICE_GET_CLASS(dev); + HotplugHandler *hotplug_ctrl; BusState *bus; Error *local_err =3D NULL; =20 @@ -881,20 +899,9 @@ static void device_set_realized(Object *obj, bool va= lue, Error **errp) goto fail; } =20 - if (dev->parent_bus && dev->parent_bus->hotplug_handler) { - hotplug_handler_plug(dev->parent_bus->hotplug_handler, - dev, &local_err); - } else if (object_dynamic_cast(qdev_get_machine(), TYPE_MACHINE)= ) { - HotplugHandler *hotplug_ctrl; - MachineState *machine =3D MACHINE(qdev_get_machine()); - MachineClass *mc =3D MACHINE_GET_CLASS(machine); - - if (mc->get_hotplug_handler) { - hotplug_ctrl =3D mc->get_hotplug_handler(machine, dev); - if (hotplug_ctrl) { - hotplug_handler_plug(hotplug_ctrl, dev, &local_err); - } - } + hotplug_ctrl =3D qdev_get_hotplug_handler(dev); + if (hotplug_ctrl) { + hotplug_handler_plug(hotplug_ctrl, dev, &local_err); } =20 if (local_err !=3D NULL) { --=20 1.8.4.5