On 2/19/25 9:22 AM, Zhenzhong Duan wrote:
> There are three iommufd related elements iommufd handle, devid and
There are three iommufd specific members in HostIOMMUDevice
IOMMUFD that need to be initialized after attach on realize_late() ...
> hwpt_id. hwpt_id is ready only after VFIO device attachment. Device
> id and iommufd handle are ready before attachment, but they are all
> iommufd related stuff, initialize them together with hwpt_id.
>
> Signed-off-by: Zhenzhong Duan <zhenzhong.d...@intel.com>
> ---
> hw/vfio/iommufd.c | 14 ++++++++++++++
> 1 file changed, 14 insertions(+)
>
> diff --git a/hw/vfio/iommufd.c b/hw/vfio/iommufd.c
> index df61edffc0..53639bf88b 100644
> --- a/hw/vfio/iommufd.c
> +++ b/hw/vfio/iommufd.c
> @@ -828,6 +828,19 @@ static bool hiod_iommufd_vfio_realize(HostIOMMUDevice
> *hiod, void *opaque,
> return true;
> }
>
> +static bool hiod_iommufd_vfio_realize_late(HostIOMMUDevice *hiod, void
> *opaque,
> + Error **errp)
> +{
> + VFIODevice *vdev = opaque;
> + HostIOMMUDeviceIOMMUFD *idev = HOST_IOMMU_DEVICE_IOMMUFD(hiod);
> +
> + idev->iommufd = vdev->iommufd;
> + idev->devid = vdev->devid;
> + idev->hwpt_id = vdev->hwpt->hwpt_id;
> +
> + return true;
> +}
> +
> static GList *
> hiod_iommufd_vfio_get_iova_ranges(HostIOMMUDevice *hiod)
> {
> @@ -852,6 +865,7 @@ static void hiod_iommufd_vfio_class_init(ObjectClass *oc,
> void *data)
> HostIOMMUDeviceClass *hiodc = HOST_IOMMU_DEVICE_CLASS(oc);
>
> hiodc->realize = hiod_iommufd_vfio_realize;
> + hiodc->realize_late = hiod_iommufd_vfio_realize_late;
> hiodc->get_iova_ranges = hiod_iommufd_vfio_get_iova_ranges;
> hiodc->get_page_size_mask = hiod_iommufd_vfio_get_page_size_mask;
> };