Blame SOURCES/kvm-s390x-vfio-ap-Implement-hot-plug-unplug-of-vfio-ap-d.patch

016a62
From e855a53f491f73e05e2b6542fb556ad80d45f89e Mon Sep 17 00:00:00 2001
016a62
From: Thomas Huth <thuth@redhat.com>
016a62
Date: Thu, 17 Oct 2019 08:43:01 +0100
016a62
Subject: [PATCH 21/21] s390x/vfio-ap: Implement hot plug/unplug of vfio-ap
016a62
 device
016a62
016a62
RH-Author: Thomas Huth <thuth@redhat.com>
016a62
Message-id: <20191017084301.8658-2-thuth@redhat.com>
016a62
Patchwork-id: 91819
016a62
O-Subject: [RHEL-8.2.0 qemu-kvm PATCH 1/1] s390x/vfio-ap: Implement hot plug/unplug of vfio-ap device
016a62
Bugzilla: 1660906
016a62
RH-Acked-by: David Hildenbrand <david@redhat.com>
016a62
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
016a62
RH-Acked-by: John Snow <jsnow@redhat.com>
016a62
016a62
From: Tony Krowiak <akrowiak@linux.ibm.com>
016a62
016a62
Introduces hot plug/unplug support for the vfio-ap device.
016a62
016a62
To hot plug a vfio-ap device using the QEMU device_add command:
016a62
016a62
	(qemu) device_add vfio-ap,sysfsdev=$path-to-mdev
016a62
016a62
	Where $path-to-mdev is the absolute path to the mediated matrix device
016a62
	to which AP resources to be used by the guest have been assigned.
016a62
016a62
A vfio-ap device can be hot plugged only if:
016a62
016a62
1. A vfio-ap device has not been attached to the virtual machine's ap-bus
016a62
   via the QEMU command line or a prior hot plug action.
016a62
016a62
2. The guest was started with the CPU model feature for AP enabled
016a62
   (e.g., -cpu host,ap=on)
016a62
016a62
To hot unplug a vfio-ap device using the QEMU device_del command:
016a62
016a62
	(qemu) device_del vfio-ap,sysfsdev=$path-to-mdev
016a62
016a62
	Where $path-to-mdev is the absolute path to the mediated matrix device
016a62
	specified when the vfio-ap device was attached to the virtual machine's
016a62
	ap-bus.
016a62
016a62
A vfio-ap device can be hot unplugged only if:
016a62
016a62
1. A vfio-ap device has been attached to the virtual machine's ap-bus
016a62
   via the QEMU command line or a prior hot plug action.
016a62
016a62
2. The guest was started with the CPU model feature for AP enabled
016a62
   (e.g., -cpu host,ap=on)
016a62
016a62
Please note that a hot plug handler is not necessary for the vfio-ap device
016a62
because the AP matrix configuration for the guest is performed by the
016a62
kernel device driver when the vfio-ap device is realized. The vfio-ap device
016a62
represents a VFIO mediated device created in the host sysfs for use by a guest.
016a62
The mdev device is configured with an AP matrix (i.e., adapters and domains) via
016a62
its sysfs attribute interfaces prior to starting the guest or plugging a vfio-ap
016a62
device in. When the device is realized, a file descriptor is opened on the mdev
016a62
device which results in a callback to the vfio_ap kernel device driver. The
016a62
device driver then configures the AP matrix in the guest's SIE state description
016a62
from the AP matrix assigned via the mdev device's sysfs interfaces. The AP
016a62
devices will be created for the guest when the AP bus running on the guest
016a62
subsequently performs its periodic scan for AP devices.
016a62
016a62
The qdev_simple_device_unplug_cb() callback function is used for the same
016a62
reaons; namely, the vfio_ap kernel device driver will perform the AP resource
016a62
de-configuration for the guest when the vfio-ap device is unplugged. When the
016a62
vfio-ap device is unrealized, the mdev device file descriptor is closed which
016a62
results in a callback to the vfio_ap kernel device driver. The device driver
016a62
then clears the AP matrix configuration in the guest's SIE state description
016a62
and resets all of the affected queues. The AP devices created for the guest
016a62
will be removed when the AP bus running on the guest subsequently performs
016a62
its periodic scan and finds there are no longer any AP resources assigned to the
016a62
guest.
016a62
016a62
Signed-off-by: Tony Krowiak <akrowiak@linux.ibm.com>
016a62
Reviewed-by: Pierre Morel <pmorel@linux.ibm.com>
016a62
Reviewed-by: David Hildenbrand <david@redhat.com>
016a62
Reviewed-by: Halil Pasic <pasic@linux.ibm.com>
016a62
Tested-by: Pierre Morel <pmorel@linux.ibm.com>
016a62
Message-Id: <1550519397-25359-2-git-send-email-akrowiak@linux.ibm.com>
016a62
[CH: adapt to changed qbus_set_hotplug_handler() signature]
016a62
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
016a62
(cherry picked from commit 374b78e37029b05f7ee2f40d0d0aabf5b5b03ce0)
016a62
016a62
Changed the qbus_set_hotplug_handler() line for RHEL: We do no have
016a62
commit 94d1cc5f03a in downstream, so no need for the OBJECT() cast here.
016a62
016a62
Signed-off-by: Thomas Huth <thuth@redhat.com>
016a62
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
016a62
---
016a62
 hw/s390x/ap-bridge.c | 12 +++++++++++-
016a62
 hw/vfio/ap.c         |  2 +-
016a62
 2 files changed, 12 insertions(+), 2 deletions(-)
016a62
016a62
diff --git a/hw/s390x/ap-bridge.c b/hw/s390x/ap-bridge.c
016a62
index 3795d30..25a0341 100644
016a62
--- a/hw/s390x/ap-bridge.c
016a62
+++ b/hw/s390x/ap-bridge.c
016a62
@@ -39,6 +39,7 @@ static const TypeInfo ap_bus_info = {
016a62
 void s390_init_ap(void)
016a62
 {
016a62
     DeviceState *dev;
016a62
+    BusState *bus;
016a62
 
016a62
     /* If no AP instructions then no need for AP bridge */
016a62
     if (!s390_has_feat(S390_FEAT_AP)) {
016a62
@@ -52,13 +53,18 @@ void s390_init_ap(void)
016a62
     qdev_init_nofail(dev);
016a62
 
016a62
     /* Create bus on bridge device */
016a62
-    qbus_create(TYPE_AP_BUS, dev, TYPE_AP_BUS);
016a62
+    bus = qbus_create(TYPE_AP_BUS, dev, TYPE_AP_BUS);
016a62
+
016a62
+    /* Enable hotplugging */
016a62
+    qbus_set_hotplug_handler(bus, dev, &error_abort);
016a62
  }
016a62
 
016a62
 static void ap_bridge_class_init(ObjectClass *oc, void *data)
016a62
 {
016a62
     DeviceClass *dc = DEVICE_CLASS(oc);
016a62
+    HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc);
016a62
 
016a62
+    hc->unplug = qdev_simple_device_unplug_cb;
016a62
     set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
016a62
 }
016a62
 
016a62
@@ -67,6 +73,10 @@ static const TypeInfo ap_bridge_info = {
016a62
     .parent        = TYPE_SYS_BUS_DEVICE,
016a62
     .instance_size = 0,
016a62
     .class_init    = ap_bridge_class_init,
016a62
+    .interfaces = (InterfaceInfo[]) {
016a62
+        { TYPE_HOTPLUG_HANDLER },
016a62
+        { }
016a62
+    }
016a62
 };
016a62
 
016a62
 static void ap_register(void)
016a62
diff --git a/hw/vfio/ap.c b/hw/vfio/ap.c
016a62
index 3962bb7..a899f8e 100644
016a62
--- a/hw/vfio/ap.c
016a62
+++ b/hw/vfio/ap.c
016a62
@@ -161,7 +161,7 @@ static void vfio_ap_class_init(ObjectClass *klass, void *data)
016a62
     set_bit(DEVICE_CATEGORY_MISC, dc->categories);
016a62
     dc->realize = vfio_ap_realize;
016a62
     dc->unrealize = vfio_ap_unrealize;
016a62
-    dc->hotpluggable = false;
016a62
+    dc->hotpluggable = true;
016a62
     dc->reset = vfio_ap_reset;
016a62
     dc->bus_type = TYPE_AP_BUS;
016a62
 }
016a62
-- 
016a62
1.8.3.1
016a62