[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RFC PATCH v4 15/24] vfio/container-base: Introduce [attach/detach]_devi
From: |
Zhenzhong Duan |
Subject: |
[RFC PATCH v4 15/24] vfio/container-base: Introduce [attach/detach]_device container callbacks |
Date: |
Wed, 12 Jul 2023 15:25:19 +0800 |
From: Eric Auger <eric.auger@redhat.com>
Let's turn attach/detach_device as container callbacks. That way,
their implementation can be easily customized for a given backend.
For the time being, only the legacy container is supported.
Signed-off-by: Eric Auger <eric.auger@redhat.com>
Signed-off-by: Yi Liu <yi.l.liu@intel.com>
Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
---
hw/vfio/as.c | 22 ++++++++++++++++++++++
hw/vfio/container.c | 10 +++++++---
include/hw/vfio/vfio-common.h | 1 +
include/hw/vfio/vfio-container-base.h | 3 +++
4 files changed, 33 insertions(+), 3 deletions(-)
diff --git a/hw/vfio/as.c b/hw/vfio/as.c
index 1cdbeb3ce4..0a2363f437 100644
--- a/hw/vfio/as.c
+++ b/hw/vfio/as.c
@@ -1526,6 +1526,28 @@ retry:
return info;
}
+int vfio_attach_device(char *name, VFIODevice *vbasedev,
+ AddressSpace *as, Error **errp)
+{
+ const VFIOIOMMUBackendOpsClass *ops;
+
+ ops = VFIO_IOMMU_BACKEND_OPS_CLASS(
+ object_class_by_name(TYPE_VFIO_IOMMU_BACKEND_LEGACY_OPS));
+ if (!ops) {
+ error_setg(errp, "VFIO IOMMU Backend not found!");
+ return -ENODEV;
+ }
+ return ops->attach_device(name, vbasedev, as, errp);
+}
+
+void vfio_detach_device(VFIODevice *vbasedev)
+{
+ if (!vbasedev->container) {
+ return;
+ }
+ vbasedev->container->ops->detach_device(vbasedev);
+}
+
static const TypeInfo vfio_iommu_backend_ops_type_info = {
.name = TYPE_VFIO_IOMMU_BACKEND_OPS,
.parent = TYPE_OBJECT,
diff --git a/hw/vfio/container.c b/hw/vfio/container.c
index 0dc2511d71..578cc65349 100644
--- a/hw/vfio/container.c
+++ b/hw/vfio/container.c
@@ -1144,8 +1144,8 @@ static int vfio_device_groupid(VFIODevice *vbasedev,
Error **errp)
return groupid;
}
-int vfio_attach_device(char *name, VFIODevice *vbasedev,
- AddressSpace *as, Error **errp)
+static int vfio_legacy_attach_device(char *name, VFIODevice *vbasedev,
+ AddressSpace *as, Error **errp)
{
int groupid = vfio_device_groupid(vbasedev, errp);
VFIODevice *vbasedev_iter;
@@ -1174,16 +1174,18 @@ int vfio_attach_device(char *name, VFIODevice *vbasedev,
vfio_put_group(group);
return -1;
}
+ vbasedev->container = &group->container->bcontainer;
return 0;
}
-void vfio_detach_device(VFIODevice *vbasedev)
+static void vfio_legacy_detach_device(VFIODevice *vbasedev)
{
VFIOGroup *group = vbasedev->group;
vfio_put_base_device(vbasedev);
vfio_put_group(group);
+ vbasedev->container = NULL;
}
static void vfio_iommu_backend_legacy_ops_class_init(ObjectClass *oc,
@@ -1197,6 +1199,8 @@ static void
vfio_iommu_backend_legacy_ops_class_init(ObjectClass *oc,
ops->query_dirty_bitmap = vfio_legacy_query_dirty_bitmap;
ops->add_window = vfio_legacy_add_section_window;
ops->del_window = vfio_legacy_del_section_window;
+ ops->attach_device = vfio_legacy_attach_device;
+ ops->detach_device = vfio_legacy_detach_device;
}
static const TypeInfo vfio_iommu_backend_legacy_ops_type = {
diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h
index 96bb27ceea..81a87d88b6 100644
--- a/include/hw/vfio/vfio-common.h
+++ b/include/hw/vfio/vfio-common.h
@@ -90,6 +90,7 @@ typedef struct VFIODeviceOps VFIODeviceOps;
typedef struct VFIODevice {
QLIST_ENTRY(VFIODevice) next;
struct VFIOGroup *group;
+ VFIOContainer *container;
char *sysfsdev;
char *name;
DeviceState *dev;
diff --git a/include/hw/vfio/vfio-container-base.h
b/include/hw/vfio/vfio-container-base.h
index 74ccb7255f..b18fa92146 100644
--- a/include/hw/vfio/vfio-container-base.h
+++ b/include/hw/vfio/vfio-container-base.h
@@ -135,6 +135,9 @@ struct VFIOIOMMUBackendOpsClass {
int (*dma_unmap)(VFIOContainer *container,
hwaddr iova, ram_addr_t size,
IOMMUTLBEntry *iotlb);
+ int (*attach_device)(char *name, VFIODevice *vbasedev,
+ AddressSpace *as, Error **errp);
+ void (*detach_device)(VFIODevice *vbasedev);
/* migration feature */
int (*set_dirty_page_tracking)(VFIOContainer *container, bool start);
int (*query_dirty_bitmap)(VFIOContainer *bcontainer, VFIOBitmap *vbmap,
--
2.34.1
- [RFC PATCH v4 03/24] vfio/common: Move IOMMU agnostic helpers to a separate file, (continued)
- [RFC PATCH v4 03/24] vfio/common: Move IOMMU agnostic helpers to a separate file, Zhenzhong Duan, 2023/07/12
- [RFC PATCH v4 04/24] vfio/common: Introduce vfio_container_add|del_section_window(), Zhenzhong Duan, 2023/07/12
- [RFC PATCH v4 05/24] vfio/common: Extract out vfio_kvm_device_[add/del]_fd, Zhenzhong Duan, 2023/07/12
- [RFC PATCH v4 07/24] vfio/common: Refactor vfio_viommu_preset() to be group agnostic, Zhenzhong Duan, 2023/07/12
- [RFC PATCH v4 06/24] vfio/common: Add a vfio device iterator, Zhenzhong Duan, 2023/07/12
- [RFC PATCH v4 09/24] vfio/common: Rename into as.c, Zhenzhong Duan, 2023/07/12
- [RFC PATCH v4 08/24] vfio/common: Move legacy VFIO backend code into separate container.c, Zhenzhong Duan, 2023/07/12
- [RFC PATCH v4 11/24] vfio/container: Introduce vfio_[attach/detach]_device, Zhenzhong Duan, 2023/07/12
- [RFC PATCH v4 12/24] vfio/platform: Use vfio_[attach/detach]_device, Zhenzhong Duan, 2023/07/12
- [RFC PATCH v4 10/24] vfio: Add base container, Zhenzhong Duan, 2023/07/12
- [RFC PATCH v4 15/24] vfio/container-base: Introduce [attach/detach]_device container callbacks,
Zhenzhong Duan <=
- [RFC PATCH v4 14/24] vfio/ccw: Use vfio_[attach/detach]_device, Zhenzhong Duan, 2023/07/12
- [RFC PATCH v4 17/24] Add iommufd configure option, Zhenzhong Duan, 2023/07/12
- [RFC PATCH v4 13/24] vfio/ap: Use vfio_[attach/detach]_device, Zhenzhong Duan, 2023/07/12
- [RFC PATCH v4 18/24] backends/iommufd: Introduce the iommufd object, Zhenzhong Duan, 2023/07/12
- [RFC PATCH v4 16/24] vfio/as: Simplify vfio_viommu_preset(), Zhenzhong Duan, 2023/07/12
- [RFC PATCH v4 19/24] util/char_dev: Add open_cdev(), Zhenzhong Duan, 2023/07/12
- [RFC PATCH v4 22/24] vfio/pci: Adapt vfio pci hot reset support with iommufd BE, Zhenzhong Duan, 2023/07/12
- [RFC PATCH v4 20/24] vfio/iommufd: Implement the iommufd backend, Zhenzhong Duan, 2023/07/12