>-----Original Message----- >From: Cédric Le Goater <c...@redhat.com> >Subject: Re: [PATCH v1 2/6] vfio/iommufd: Add properties and handlers to >TYPE_HOST_IOMMU_DEVICE_IOMMUFD > >On 5/28/25 08:04, Zhenzhong Duan wrote: >> Enhance HostIOMMUDeviceIOMMUFD object with 3 new members, specific >> to the iommufd BE + 2 new class functions. >> >> IOMMUFD BE includes IOMMUFD handle, devid and hwpt_id. IOMMUFD handle >> and devid are used to allocate/free ioas and hwpt. hwpt_id is used to >> re-attach IOMMUFD backed device to its default VFIO sub-system created >> hwpt, i.e., when vIOMMU is disabled by guest. These properties will be >> initialized after attachment. >> >> 2 new class functions are [at|de]tach_hwpt(). They are used to >> attach/detach hwpt. VFIO and VDPA can have different implementions, >> so implementation will be in sub-class instead of HostIOMMUDeviceIOMMUFD, >> e.g., in HostIOMMUDeviceIOMMUFDVFIO. >> >> Add two wrappers host_iommu_device_iommufd_[at|de]tach_hwpt to >> wrap the two functions. >> >> Signed-off-by: Zhenzhong Duan <zhenzhong.d...@intel.com> >> --- >> include/system/iommufd.h | 50 >++++++++++++++++++++++++++++++++++++++++ >> backends/iommufd.c | 22 ++++++++++++++++++ >> 2 files changed, 72 insertions(+) >> >> diff --git a/include/system/iommufd.h b/include/system/iommufd.h >> index 5399519626..a704575662 100644 >> --- a/include/system/iommufd.h >> +++ b/include/system/iommufd.h >> @@ -67,4 +67,54 @@ bool >iommufd_backend_invalidate_cache(IOMMUFDBackend *be, uint32_t id, >> Error **errp); >> >> #define TYPE_HOST_IOMMU_DEVICE_IOMMUFD >TYPE_HOST_IOMMU_DEVICE "-iommufd" >> +OBJECT_DECLARE_TYPE(HostIOMMUDeviceIOMMUFD, >HostIOMMUDeviceIOMMUFDClass, >> + HOST_IOMMU_DEVICE_IOMMUFD) >> + >> +/* Overload of the host IOMMU device for the iommufd backend */ >> +struct HostIOMMUDeviceIOMMUFD { >> + HostIOMMUDevice parent_obj; >> + >> + IOMMUFDBackend *iommufd; >> + uint32_t devid; >> + uint32_t hwpt_id; >> +}; > >the addition of new attributes would be better placed in the next patch.
OK, will merge this patch with the next patch. Thanks Zhenzhong > >Anyhow, > > > >Reviewed-by: Cédric Le Goater <c...@redhat.com> > >Thanks, > >C. > > > >> +struct HostIOMMUDeviceIOMMUFDClass { >> + HostIOMMUDeviceClass parent_class; >> + >> + /** >> + * @attach_hwpt: attach host IOMMU device to IOMMUFD hardware page >table. >> + * VFIO and VDPA device can have different implementation. >> + * >> + * Mandatory callback. >> + * >> + * @idev: host IOMMU device backed by IOMMUFD backend. >> + * >> + * @hwpt_id: ID of IOMMUFD hardware page table. >> + * >> + * @errp: pass an Error out when attachment fails. >> + * >> + * Returns: true on success, false on failure. >> + */ >> + bool (*attach_hwpt)(HostIOMMUDeviceIOMMUFD *idev, uint32_t hwpt_id, >> + Error **errp); >> + /** >> + * @detach_hwpt: detach host IOMMU device from IOMMUFD hardware >page table. >> + * VFIO and VDPA device can have different implementation. >> + * >> + * Mandatory callback. >> + * >> + * @idev: host IOMMU device backed by IOMMUFD backend. >> + * >> + * @errp: pass an Error out when attachment fails. >> + * >> + * Returns: true on success, false on failure. >> + */ >> + bool (*detach_hwpt)(HostIOMMUDeviceIOMMUFD *idev, Error **errp); >> +}; >> + >> +bool >host_iommu_device_iommufd_attach_hwpt(HostIOMMUDeviceIOMMUFD *idev, >> + uint32_t hwpt_id, Error **errp); >> +bool >host_iommu_device_iommufd_detach_hwpt(HostIOMMUDeviceIOMMUFD *idev, >> + Error **errp); >> #endif >> diff --git a/backends/iommufd.c b/backends/iommufd.c >> index c8788a6438..b114fb08e7 100644 >> --- a/backends/iommufd.c >> +++ b/backends/iommufd.c >> @@ -344,6 +344,26 @@ bool >iommufd_backend_invalidate_cache(IOMMUFDBackend *be, uint32_t id, >> return !ret; >> } >> >> +bool >host_iommu_device_iommufd_attach_hwpt(HostIOMMUDeviceIOMMUFD *idev, >> + uint32_t hwpt_id, Error **errp) >> +{ >> + HostIOMMUDeviceIOMMUFDClass *idevc = >> + HOST_IOMMU_DEVICE_IOMMUFD_GET_CLASS(idev); >> + >> + g_assert(idevc->attach_hwpt); >> + return idevc->attach_hwpt(idev, hwpt_id, errp); >> +} >> + >> +bool >host_iommu_device_iommufd_detach_hwpt(HostIOMMUDeviceIOMMUFD *idev, >> + Error **errp) >> +{ >> + HostIOMMUDeviceIOMMUFDClass *idevc = >> + HOST_IOMMU_DEVICE_IOMMUFD_GET_CLASS(idev); >> + >> + g_assert(idevc->detach_hwpt); >> + return idevc->detach_hwpt(idev, errp); >> +} >> + >> static int hiod_iommufd_get_cap(HostIOMMUDevice *hiod, int cap, Error >**errp) >> { >> HostIOMMUDeviceCaps *caps = &hiod->caps; >> @@ -382,6 +402,8 @@ static const TypeInfo types[] = { >> }, { >> .name = TYPE_HOST_IOMMU_DEVICE_IOMMUFD, >> .parent = TYPE_HOST_IOMMU_DEVICE, >> + .instance_size = sizeof(HostIOMMUDeviceIOMMUFD), >> + .class_size = sizeof(HostIOMMUDeviceIOMMUFDClass), >> .class_init = hiod_iommufd_class_init, >> .abstract = true, >> }