mirror of https://github.com/xemu-project/xemu.git
pci/pcie: perform unplug via the hotplug handler
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 <david@gibson.dropbear.id.au> Reviewed-by: Igor Mammedov <imammedo@redhat.com> Signed-off-by: David Hildenbrand <david@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
c97adf3ccf
commit
a1952d01e7
|
@ -442,11 +442,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));
|
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,
|
void pcie_cap_slot_unplug_request_cb(HotplugHandler *hotplug_dev,
|
||||||
DeviceState *dev, Error **errp)
|
DeviceState *dev, Error **errp)
|
||||||
{
|
{
|
||||||
|
|
|
@ -155,6 +155,7 @@ static void pcie_slot_class_init(ObjectClass *oc, void *data)
|
||||||
|
|
||||||
dc->props = pcie_slot_props;
|
dc->props = pcie_slot_props;
|
||||||
hc->plug = pcie_cap_slot_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;
|
hc->unplug_request = pcie_cap_slot_unplug_request_cb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -134,6 +134,8 @@ void pcie_ats_init(PCIDevice *dev, uint16_t offset);
|
||||||
|
|
||||||
void pcie_cap_slot_plug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
|
void pcie_cap_slot_plug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
|
||||||
Error **errp);
|
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,
|
void pcie_cap_slot_unplug_request_cb(HotplugHandler *hotplug_dev,
|
||||||
DeviceState *dev, Error **errp);
|
DeviceState *dev, Error **errp);
|
||||||
#endif /* QEMU_PCIE_H */
|
#endif /* QEMU_PCIE_H */
|
||||||
|
|
Loading…
Reference in New Issue