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 <c...@redhat.com> > Signed-off-by: Zhenzhong Duan <zhenzhong.d...@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); > }