[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-ppc] [PATCH v3 08/11] pci/pcie: perform unplug via the hotplug han
From: |
David Hildenbrand |
Subject: |
[Qemu-ppc] [PATCH v3 08/11] pci/pcie: perform unplug via the hotplug handler |
Date: |
Tue, 20 Nov 2018 12:04:24 +0100 |
Introduce and use the "unplug" callback.
This is a preparation for multi-stage hotplug handlers, whereby the bus
hotplug handler is overwritten by the machine hotplug handler. This handler
will then pass control to the bus hotplug handler. So to get this running
cleanly, we also have to make sure to go via the hotplug handler chain when
actually unplugging a device after an unplug request. Lookup the hotplug
handler and call "unplug".
Reviewed-by: David Gibson <address@hidden>
Reviewed-by: Igor Mammedov <address@hidden>
Signed-off-by: David Hildenbrand <address@hidden>
---
hw/pci/pcie.c | 10 +++++++++-
hw/pci/pcie_port.c | 1 +
include/hw/pci/pcie.h | 2 ++
3 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/hw/pci/pcie.c b/hw/pci/pcie.c
index ccba29269e..ba3ea925e9 100644
--- a/hw/pci/pcie.c
+++ b/hw/pci/pcie.c
@@ -364,11 +364,19 @@ void pcie_cap_slot_plug_cb(HotplugHandler *hotplug_dev,
DeviceState *dev,
}
}
-static void pcie_unplug_device(PCIBus *bus, PCIDevice *dev, void *opaque)
+void pcie_cap_slot_unplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
+ Error **errp)
{
object_unparent(OBJECT(dev));
}
+static void pcie_unplug_device(PCIBus *bus, PCIDevice *dev, void *opaque)
+{
+ HotplugHandler *hotplug_ctrl = qdev_get_hotplug_handler(DEVICE(dev));
+
+ hotplug_handler_unplug(hotplug_ctrl, DEVICE(dev), &error_abort);
+}
+
void pcie_cap_slot_unplug_request_cb(HotplugHandler *hotplug_dev,
DeviceState *dev, Error **errp)
{
diff --git a/hw/pci/pcie_port.c b/hw/pci/pcie_port.c
index 7982a87880..a30291ef54 100644
--- a/hw/pci/pcie_port.c
+++ b/hw/pci/pcie_port.c
@@ -156,6 +156,7 @@ static void pcie_slot_class_init(ObjectClass *oc, void
*data)
dc->props = pcie_slot_props;
hc->pre_plug = pcie_cap_slot_pre_plug_cb;
hc->plug = pcie_cap_slot_plug_cb;
+ hc->unplug = pcie_cap_slot_unplug_cb;
hc->unplug_request = pcie_cap_slot_unplug_request_cb;
}
diff --git a/include/hw/pci/pcie.h b/include/hw/pci/pcie.h
index d9fbcf4a4a..9ae6482658 100644
--- a/include/hw/pci/pcie.h
+++ b/include/hw/pci/pcie.h
@@ -135,6 +135,8 @@ void pcie_cap_slot_pre_plug_cb(HotplugHandler *hotplug_dev,
DeviceState *dev,
Error **errp);
void pcie_cap_slot_plug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
Error **errp);
+void pcie_cap_slot_unplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
+ Error **errp);
void pcie_cap_slot_unplug_request_cb(HotplugHandler *hotplug_dev,
DeviceState *dev, Error **errp);
#endif /* QEMU_PCIE_H */
--
2.17.2
- [Qemu-ppc] [PATCH v3 04/11] pci/pcie: stop plug/unplug if the slot is locked, (continued)
- [Qemu-ppc] [PATCH v3 04/11] pci/pcie: stop plug/unplug if the slot is locked, David Hildenbrand, 2018/11/20
- [Qemu-ppc] [PATCH v3 03/11] s390x/pci: rename hotplug handler callbacks, David Hildenbrand, 2018/11/20
- [Qemu-ppc] [PATCH v3 05/11] pci/pcihp: perform check for bus capability in pre_plug handler, David Hildenbrand, 2018/11/20
- [Qemu-ppc] [PATCH v3 07/11] pci/pcihp: perform unplug via the hotplug handler, David Hildenbrand, 2018/11/20
- [Qemu-ppc] [PATCH v3 06/11] pci/pcihp: overwrite hotplug handler recursively from the start, David Hildenbrand, 2018/11/20
- [Qemu-ppc] [PATCH v3 09/11] pci: Reuse pci-bridge hotplug handler handlers for pcie-pci-bridge, David Hildenbrand, 2018/11/20
- [Qemu-ppc] [PATCH v3 10/11] pci/shpc: perform unplug via the hotplug handler, David Hildenbrand, 2018/11/20
- [Qemu-ppc] [PATCH v3 08/11] pci/pcie: perform unplug via the hotplug handler,
David Hildenbrand <=
- [Qemu-ppc] [PATCH v3 11/11] spapr_pci: perform unplug via the hotplug handler, David Hildenbrand, 2018/11/20
- Re: [Qemu-ppc] [PATCH v3 00/11] pci: hotplug handler reworks, David Hildenbrand, 2018/11/21