aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Hildenbrand <david@redhat.com>2019-01-30 16:57:33 +0100
committerCornelia Huck <cohuck@redhat.com>2019-02-05 10:34:06 +0100
commit2313a88fe68cb970532ba1641ffc35c848daae86 (patch)
tree48f9d8ffe6ce8651f09a10b86ba33f342ecb99fd
parent703fef6fcf3edcbf169c90b6196fcf88f9e9765a (diff)
downloadqemu-2313a88fe68cb970532ba1641ffc35c848daae86.zip
qemu-2313a88fe68cb970532ba1641ffc35c848daae86.tar.gz
qemu-2313a88fe68cb970532ba1641ffc35c848daae86.tar.bz2
s390x/pci: Unplug remaining requested devices on pcihost reset
When resetting the guest we should unplug and remove all devices that are still pending. With this patch, the requested device will be unplugged on reboot (S390_RESET_EXTERNAL and S390_RESET_REIPL, which reset the pcihost bridge via qemu_devices_reset()). This approach is similar to what's done for acpi PCI hotplug in acpi_pcihp_reset() -> acpi_pcihp_update() -> acpi_pcihp_update_hotplug_bus() -> acpi_pcihp_eject_slot(). s390_pci_generate_plug_event()'s will still be generated, I guess this is not an issue. The same thing would happen right now when unplugging a device just before starting the guest. Signed-off-by: David Hildenbrand <david@redhat.com> Message-Id: <20190130155733.32742-7-david@redhat.com> Reviewed-by: Collin Walling <walling@linux.ibm.com> Signed-off-by: Cornelia Huck <cohuck@redhat.com>
-rw-r--r--hw/s390x/s390-pci-bus.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
index 3816fb1..80ff1ce 100644
--- a/hw/s390x/s390-pci-bus.c
+++ b/hw/s390x/s390-pci-bus.c
@@ -1093,6 +1093,21 @@ static void s390_pcihost_reset(DeviceState *dev)
{
S390pciState *s = S390_PCI_HOST_BRIDGE(dev);
PCIBus *bus = s->parent_obj.bus;
+ S390PCIBusDevice *pbdev, *next;
+
+ /* Process all pending unplug requests */
+ QTAILQ_FOREACH_SAFE(pbdev, &s->zpci_devs, link, next) {
+ if (pbdev->unplug_requested) {
+ if (pbdev->summary_ind) {
+ pci_dereg_irqs(pbdev);
+ }
+ if (pbdev->iommu->enabled) {
+ pci_dereg_ioat(pbdev->iommu);
+ }
+ pbdev->state = ZPCI_FS_STANDBY;
+ s390_pci_perform_unplug(pbdev);
+ }
+ }
/*
* When resetting a PCI bridge, the assigned numbers are set to 0. So