|
|
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 |
|