Hi Zhenzhong,
On 6/3/24 08:10, Zhenzhong Duan wrote:
> Create host IOMMU device instance in vfio_attach_device() and call
> .realize() to initialize it further.
I would squash this with the previous patch
Eric
>
> Suggested-by: Cédric Le Goater <clg@redhat.com>
> Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
> ---
> include/hw/vfio/vfio-common.h | 1 +
> hw/vfio/common.c | 16 +++++++++++++++-
> 2 files changed, 16 insertions(+), 1 deletion(-)
>
> diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h
> index 56d1717211..c0851e83bb 100644
> --- a/include/hw/vfio/vfio-common.h
> +++ b/include/hw/vfio/vfio-common.h
> @@ -127,6 +127,7 @@ typedef struct VFIODevice {
> OnOffAuto pre_copy_dirty_page_tracking;
> bool dirty_pages_supported;
> bool dirty_tracking;
> + HostIOMMUDevice *hiod;
> int devid;
> IOMMUFDBackend *iommufd;
> } VFIODevice;
> diff --git a/hw/vfio/common.c b/hw/vfio/common.c
> index f9619a1dfb..f20a7b5bba 100644
> --- a/hw/vfio/common.c
> +++ b/hw/vfio/common.c
> @@ -1528,6 +1528,7 @@ bool vfio_attach_device(char *name, VFIODevice *vbasedev,
> {
> const VFIOIOMMUClass *ops =
> VFIO_IOMMU_CLASS(object_class_by_name(TYPE_VFIO_IOMMU_LEGACY));
> + HostIOMMUDevice *hiod;
>
> if (vbasedev->iommufd) {
> ops = VFIO_IOMMU_CLASS(object_class_by_name(TYPE_VFIO_IOMMU_IOMMUFD));
> @@ -1535,7 +1536,19 @@ bool vfio_attach_device(char *name, VFIODevice *vbasedev,
>
> assert(ops);
>
> - return ops->attach_device(name, vbasedev, as, errp);
> + if (!ops->attach_device(name, vbasedev, as, errp)) {
> + return false;
> + }
> +
> + hiod = HOST_IOMMU_DEVICE(object_new(ops->hiod_typename));
> + if (!HOST_IOMMU_DEVICE_GET_CLASS(hiod)->realize(hiod, vbasedev, errp)) {
> + object_unref(hiod);
> + ops->detach_device(vbasedev);
> + return false;
> + }
> + vbasedev->hiod = hiod;
> +
> + return true;
> }
>
> void vfio_detach_device(VFIODevice *vbasedev)
> @@ -1543,5 +1556,6 @@ void vfio_detach_device(VFIODevice *vbasedev)
> if (!vbasedev->bcontainer) {
> return;
> }
> + object_unref(vbasedev->hiod);
> vbasedev->bcontainer->ops->detach_device(vbasedev);
> }