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