diff options
author | David Hildenbrand <david@redhat.com> | 2023-07-11 17:34:43 +0200 |
---|---|---|
committer | David Hildenbrand <david@redhat.com> | 2023-07-12 09:27:30 +0200 |
commit | aac44204bc6d2a062c2e1658fe6a02a67f55b9e6 (patch) | |
tree | 10630ade59ccd5e3af1dd3c5f263dd9102b2d249 /hw/virtio/virtio-md-pci.c | |
parent | c29dd73f74fe6020ee0755d938885919a3719194 (diff) | |
download | qemu-aac44204bc6d2a062c2e1658fe6a02a67f55b9e6.zip qemu-aac44204bc6d2a062c2e1658fe6a02a67f55b9e6.tar.gz qemu-aac44204bc6d2a062c2e1658fe6a02a67f55b9e6.tar.bz2 |
virtio-md-pci: Support unplug requests for compatible devices
Let's support unplug requests for virtio-md-pci devices that provide
a unplug_request_check() callback.
We'll wire that up for virtio-mem-pci next.
Message-ID: <20230711153445.514112-6-david@redhat.com>
Tested-by: Mario Casquero <mcasquer@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
Diffstat (limited to 'hw/virtio/virtio-md-pci.c')
-rw-r--r-- | hw/virtio/virtio-md-pci.c | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/hw/virtio/virtio-md-pci.c b/hw/virtio/virtio-md-pci.c index a22a259..62bfb79 100644 --- a/hw/virtio/virtio-md-pci.c +++ b/hw/virtio/virtio-md-pci.c @@ -69,8 +69,42 @@ void virtio_md_pci_plug(VirtIOMDPCI *vmd, MachineState *ms, Error **errp) void virtio_md_pci_unplug_request(VirtIOMDPCI *vmd, MachineState *ms, Error **errp) { - /* We don't support hot unplug of virtio based memory devices */ - error_setg(errp, "virtio based memory devices cannot be unplugged."); + VirtIOMDPCIClass *vmdc = VIRTIO_MD_PCI_GET_CLASS(vmd); + DeviceState *dev = DEVICE(vmd); + HotplugHandler *bus_handler = qdev_get_bus_hotplug_handler(dev); + HotplugHandlerClass *hdc; + Error *local_err = NULL; + + if (!vmdc->unplug_request_check) { + error_setg(errp, "this virtio based memory devices cannot be unplugged"); + return; + } + + if (!bus_handler) { + error_setg(errp, "hotunplug of virtio based memory devices not" + "supported on this bus"); + return; + } + + vmdc->unplug_request_check(vmd, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + + /* + * Forward the async request or turn it into a sync request (handling it + * like qdev_unplug()). + */ + hdc = HOTPLUG_HANDLER_GET_CLASS(bus_handler); + if (hdc->unplug_request) { + hotplug_handler_unplug_request(bus_handler, dev, &local_err); + } else { + virtio_md_pci_unplug(vmd, ms, &local_err); + if (!local_err) { + object_unparent(OBJECT(dev)); + } + } } void virtio_md_pci_unplug(VirtIOMDPCI *vmd, MachineState *ms, Error **errp) |