Pablo Greco e6a3ae
From ed71d0c46408c9fdf4df93ddc4d0610f0b039696 Mon Sep 17 00:00:00 2001
Pablo Greco e6a3ae
From: Cornelia Huck <cohuck@redhat.com>
Pablo Greco e6a3ae
Date: Wed, 17 Apr 2019 13:57:39 +0100
Pablo Greco e6a3ae
Subject: [PATCH 22/24] s390x/pci: Unplug remaining requested devices on
Pablo Greco e6a3ae
 pcihost reset
Pablo Greco e6a3ae
Pablo Greco e6a3ae
RH-Author: Cornelia Huck <cohuck@redhat.com>
Pablo Greco e6a3ae
Message-id: <20190417135741.25297-23-cohuck@redhat.com>
Pablo Greco e6a3ae
Patchwork-id: 85805
Pablo Greco e6a3ae
O-Subject: [RHEL-8.1.0 qemu-kvm PATCH v2 22/24] s390x/pci: Unplug remaining requested devices on pcihost reset
Pablo Greco e6a3ae
Bugzilla: 1699070
Pablo Greco e6a3ae
RH-Acked-by: David Hildenbrand <david@redhat.com>
Pablo Greco e6a3ae
RH-Acked-by: Thomas Huth <thuth@redhat.com>
Pablo Greco e6a3ae
RH-Acked-by: Jens Freimann <jfreimann@redhat.com>
Pablo Greco e6a3ae
Pablo Greco e6a3ae
From: David Hildenbrand <david@redhat.com>
Pablo Greco e6a3ae
Pablo Greco e6a3ae
When resetting the guest we should unplug and remove all devices that
Pablo Greco e6a3ae
are still pending.
Pablo Greco e6a3ae
Pablo Greco e6a3ae
With this patch, the requested device will be unplugged on reboot
Pablo Greco e6a3ae
(S390_RESET_EXTERNAL and S390_RESET_REIPL, which reset the pcihost bridge
Pablo Greco e6a3ae
via qemu_devices_reset()).
Pablo Greco e6a3ae
Pablo Greco e6a3ae
This approach is similar to what's done for acpi PCI hotplug in
Pablo Greco e6a3ae
acpi_pcihp_reset() -> acpi_pcihp_update() ->
Pablo Greco e6a3ae
acpi_pcihp_update_hotplug_bus() -> acpi_pcihp_eject_slot().
Pablo Greco e6a3ae
Pablo Greco e6a3ae
s390_pci_generate_plug_event()'s will still be generated, I guess this
Pablo Greco e6a3ae
is not an issue. The same thing would happen right now when unplugging
Pablo Greco e6a3ae
a device just before starting the guest.
Pablo Greco e6a3ae
Pablo Greco e6a3ae
Signed-off-by: David Hildenbrand <david@redhat.com>
Pablo Greco e6a3ae
Message-Id: <20190130155733.32742-7-david@redhat.com>
Pablo Greco e6a3ae
Reviewed-by: Collin Walling <walling@linux.ibm.com>
Pablo Greco e6a3ae
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
Pablo Greco e6a3ae
(cherry picked from commit 2313a88fe68cb970532ba1641ffc35c848daae86)
Pablo Greco e6a3ae
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
Pablo Greco e6a3ae
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
Pablo Greco e6a3ae
---
Pablo Greco e6a3ae
 hw/s390x/s390-pci-bus.c | 15 +++++++++++++++
Pablo Greco e6a3ae
 1 file changed, 15 insertions(+)
Pablo Greco e6a3ae
Pablo Greco e6a3ae
diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
Pablo Greco e6a3ae
index 1ba7873..383b3e7 100644
Pablo Greco e6a3ae
--- a/hw/s390x/s390-pci-bus.c
Pablo Greco e6a3ae
+++ b/hw/s390x/s390-pci-bus.c
Pablo Greco e6a3ae
@@ -1097,6 +1097,21 @@ static void s390_pcihost_reset(DeviceState *dev)
Pablo Greco e6a3ae
 {
Pablo Greco e6a3ae
     S390pciState *s = S390_PCI_HOST_BRIDGE(dev);
Pablo Greco e6a3ae
     PCIBus *bus = s->parent_obj.bus;
Pablo Greco e6a3ae
+    S390PCIBusDevice *pbdev, *next;
Pablo Greco e6a3ae
+
Pablo Greco e6a3ae
+    /* Process all pending unplug requests */
Pablo Greco e6a3ae
+    QTAILQ_FOREACH_SAFE(pbdev, &s->zpci_devs, link, next) {
Pablo Greco e6a3ae
+        if (pbdev->unplug_requested) {
Pablo Greco e6a3ae
+            if (pbdev->summary_ind) {
Pablo Greco e6a3ae
+                pci_dereg_irqs(pbdev);
Pablo Greco e6a3ae
+            }
Pablo Greco e6a3ae
+            if (pbdev->iommu->enabled) {
Pablo Greco e6a3ae
+                pci_dereg_ioat(pbdev->iommu);
Pablo Greco e6a3ae
+            }
Pablo Greco e6a3ae
+            pbdev->state = ZPCI_FS_STANDBY;
Pablo Greco e6a3ae
+            s390_pci_perform_unplug(pbdev);
Pablo Greco e6a3ae
+        }
Pablo Greco e6a3ae
+    }
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
     /*
Pablo Greco e6a3ae
      * When resetting a PCI bridge, the assigned numbers are set to 0. So
Pablo Greco e6a3ae
-- 
Pablo Greco e6a3ae
1.8.3.1
Pablo Greco e6a3ae