summaryrefslogtreecommitdiffstats
path: root/hw/core
diff options
context:
space:
mode:
authorIgor Mammedov2014-02-05 16:36:52 +0100
committerMichael S. Tsirkin2014-02-10 09:27:00 +0100
commit5e95494380ecf83c97d28f72134ab45e0cace8f9 (patch)
tree20d5e5a53d96ea810ffdc2f828aa4c26f60c3f9e /hw/core
parentpci/pcie: convert PCIE hotplug to use hotplug-handler API (diff)
downloadqemu-5e95494380ecf83c97d28f72134ab45e0cace8f9.tar.gz
qemu-5e95494380ecf83c97d28f72134ab45e0cace8f9.tar.xz
qemu-5e95494380ecf83c97d28f72134ab45e0cace8f9.zip
hw/pci: switch to a generic hotplug handling for PCIDevice
make qdev_unplug()/device_set_realized() to call hotplug handler's plug/unplug methods if available and remove not needed anymore hot(un)plug handling from PCIDevice. In case if hotplug handler is not available, revert to the legacy hotplug method for compatibility with not yet converted buses. Signed-off-by: Igor Mammedov <imammedo@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Diffstat (limited to 'hw/core')
-rw-r--r--hw/core/qdev.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index 5c864dbfa7..64b66e07ef 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -213,7 +213,6 @@ void qdev_unplug(DeviceState *dev, Error **errp)
error_set(errp, QERR_BUS_NO_HOTPLUG, dev->parent_bus->name);
return;
}
- assert(dc->unplug != NULL);
if (!dc->hotpluggable) {
error_set(errp, QERR_DEVICE_NO_HOTPLUG,
@@ -223,9 +222,13 @@ void qdev_unplug(DeviceState *dev, Error **errp)
qdev_hot_removed = true;
- if (dc->unplug(dev) < 0) {
- error_set(errp, QERR_UNDEFINED_ERROR);
- return;
+ if (dev->parent_bus && dev->parent_bus->hotplug_handler) {
+ hotplug_handler_unplug(dev->parent_bus->hotplug_handler, dev, errp);
+ } else {
+ assert(dc->unplug != NULL);
+ if (dc->unplug(dev) < 0) { /* legacy handler */
+ error_set(errp, QERR_UNDEFINED_ERROR);
+ }
}
}
@@ -720,6 +723,12 @@ static void device_set_realized(Object *obj, bool value, Error **err)
dc->realize(dev, &local_err);
}
+ if (dev->parent_bus && dev->parent_bus->hotplug_handler &&
+ local_err == NULL) {
+ hotplug_handler_plug(dev->parent_bus->hotplug_handler,
+ dev, &local_err);
+ }
+
if (qdev_get_vmsd(dev) && local_err == NULL) {
vmstate_register_with_alias_id(dev, -1, qdev_get_vmsd(dev), dev,
dev->instance_id_alias,