>-----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,
>>       }

Reply via email to