forked from rpms/qemu-kvm
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
3.3 KiB
98 lines
3.3 KiB
8 months ago
|
From a5d19bfbfddb36fa6d68ca6282a5acd9b245d48a Mon Sep 17 00:00:00 2001
|
||
|
From: Eric Auger <eric.auger@redhat.com>
|
||
|
Date: Thu, 2 Nov 2023 15:12:41 +0800
|
||
|
Subject: [PATCH 016/101] vfio/container: Implement attach/detach_device
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: text/plain; charset=UTF-8
|
||
|
Content-Transfer-Encoding: 8bit
|
||
|
|
||
|
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||
|
RH-MergeRequest: 211: IOMMUFD backend backport
|
||
|
RH-Jira: RHEL-19302 RHEL-21057
|
||
|
RH-Acked-by: Cédric Le Goater <clg@redhat.com>
|
||
|
RH-Acked-by: Sebastian Ott <sebott@redhat.com>
|
||
|
RH-Commit: [15/67] e233c90e4af2061dc0612bc1b1d17be1a47daeae (eauger1/centos-qemu-kvm)
|
||
|
|
||
|
No functional change intended.
|
||
|
|
||
|
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||
|
Signed-off-by: Yi Liu <yi.l.liu@intel.com>
|
||
|
Signed-off-by: Yi Sun <yi.y.sun@linux.intel.com>
|
||
|
Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
|
||
|
Reviewed-by: Cédric Le Goater <clg@redhat.com>
|
||
|
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||
|
(cherry picked from commit 1eb31f13b24c49884d8256f96a6664df2dd0824d)
|
||
|
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||
|
---
|
||
|
hw/vfio/common.c | 16 ++++++++++++++++
|
||
|
hw/vfio/container.c | 12 +++++-------
|
||
|
2 files changed, 21 insertions(+), 7 deletions(-)
|
||
|
|
||
|
diff --git a/hw/vfio/common.c b/hw/vfio/common.c
|
||
|
index 8ef2e7967d..483ba82089 100644
|
||
|
--- a/hw/vfio/common.c
|
||
|
+++ b/hw/vfio/common.c
|
||
|
@@ -1498,3 +1498,19 @@ retry:
|
||
|
|
||
|
return info;
|
||
|
}
|
||
|
+
|
||
|
+int vfio_attach_device(char *name, VFIODevice *vbasedev,
|
||
|
+ AddressSpace *as, Error **errp)
|
||
|
+{
|
||
|
+ const VFIOIOMMUOps *ops = &vfio_legacy_ops;
|
||
|
+
|
||
|
+ return ops->attach_device(name, vbasedev, as, errp);
|
||
|
+}
|
||
|
+
|
||
|
+void vfio_detach_device(VFIODevice *vbasedev)
|
||
|
+{
|
||
|
+ if (!vbasedev->bcontainer) {
|
||
|
+ return;
|
||
|
+ }
|
||
|
+ vbasedev->bcontainer->ops->detach_device(vbasedev);
|
||
|
+}
|
||
|
diff --git a/hw/vfio/container.c b/hw/vfio/container.c
|
||
|
index 721c0d7375..6bacf38222 100644
|
||
|
--- a/hw/vfio/container.c
|
||
|
+++ b/hw/vfio/container.c
|
||
|
@@ -873,8 +873,8 @@ static int vfio_device_groupid(VFIODevice *vbasedev, Error **errp)
|
||
|
* @name and @vbasedev->name are likely to be different depending
|
||
|
* on the type of the device, hence the need for passing @name
|
||
|
*/
|
||
|
-int vfio_attach_device(char *name, VFIODevice *vbasedev,
|
||
|
- AddressSpace *as, Error **errp)
|
||
|
+static int vfio_legacy_attach_device(const char *name, VFIODevice *vbasedev,
|
||
|
+ AddressSpace *as, Error **errp)
|
||
|
{
|
||
|
int groupid = vfio_device_groupid(vbasedev, errp);
|
||
|
VFIODevice *vbasedev_iter;
|
||
|
@@ -914,14 +914,10 @@ int vfio_attach_device(char *name, VFIODevice *vbasedev,
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
-void vfio_detach_device(VFIODevice *vbasedev)
|
||
|
+static void vfio_legacy_detach_device(VFIODevice *vbasedev)
|
||
|
{
|
||
|
VFIOGroup *group = vbasedev->group;
|
||
|
|
||
|
- if (!vbasedev->bcontainer) {
|
||
|
- return;
|
||
|
- }
|
||
|
-
|
||
|
QLIST_REMOVE(vbasedev, global_next);
|
||
|
QLIST_REMOVE(vbasedev, container_next);
|
||
|
vbasedev->bcontainer = NULL;
|
||
|
@@ -933,6 +929,8 @@ void vfio_detach_device(VFIODevice *vbasedev)
|
||
|
const VFIOIOMMUOps vfio_legacy_ops = {
|
||
|
.dma_map = vfio_legacy_dma_map,
|
||
|
.dma_unmap = vfio_legacy_dma_unmap,
|
||
|
+ .attach_device = vfio_legacy_attach_device,
|
||
|
+ .detach_device = vfio_legacy_detach_device,
|
||
|
.set_dirty_page_tracking = vfio_legacy_set_dirty_page_tracking,
|
||
|
.query_dirty_bitmap = vfio_legacy_query_dirty_bitmap,
|
||
|
};
|
||
|
--
|
||
|
2.39.3
|
||
|
|