yeahuh / rpms / qemu-kvm

Forked from rpms/qemu-kvm 2 years ago
Clone

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

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