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