>-----Original Message-----
>From: Steven Sistare <steven.sist...@oracle.com>
>Subject: Re: [PATCH V5 31/38] vfio/iommufd: cpr state
>
>On 6/23/2025 6:45 AM, Duan, Zhenzhong wrote:
>>> -----Original Message-----
>>> From: Steve Sistare <steven.sist...@oracle.com>
>>> Subject: [PATCH V5 31/38] vfio/iommufd: cpr state
>>>
>>> VFIO iommufd devices will need access to ioas_id, devid, and hwpt_id in
>>> new QEMU at realize time, so add them to CPR state.  Define
>CprVFIODevice
>>> as the object which holds the state and is serialized to the vmstate file.
>>> Define accessors to copy state between VFIODevice and CprVFIODevice.
>>>
>>> Signed-off-by: Steve Sistare <steven.sist...@oracle.com>
>>> ---
>>> include/hw/vfio/vfio-cpr.h |  3 ++
>>> hw/vfio/cpr-iommufd.c      | 96
>>> +++++++++++++++++++++++++++++++++++++++++++++-
>>> hw/vfio/iommufd.c          |  2 +
>>> 3 files changed, 100 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/include/hw/vfio/vfio-cpr.h b/include/hw/vfio/vfio-cpr.h
>>> index 619af07..f88e4ba 100644
>>> --- a/include/hw/vfio/vfio-cpr.h
>>> +++ b/include/hw/vfio/vfio-cpr.h
>>> @@ -33,6 +33,8 @@ typedef struct VFIOContainerCPR {
>>> typedef struct VFIODeviceCPR {
>>>      Error *mdev_blocker;
>>>      Error *id_blocker;
>>> +    uint32_t hwpt_id;
>>> +    uint32_t ioas_id;
>>> } VFIODeviceCPR;
>>>
>>> bool vfio_legacy_cpr_register_container(struct VFIOContainer *container,
>>> @@ -54,6 +56,7 @@ bool vfio_iommufd_cpr_register_iommufd(struct
>>> IOMMUFDBackend *be, Error **errp);
>>> void vfio_iommufd_cpr_unregister_iommufd(struct IOMMUFDBackend
>*be);
>>> void vfio_iommufd_cpr_register_device(struct VFIODevice *vbasedev);
>>> void vfio_iommufd_cpr_unregister_device(struct VFIODevice *vbasedev);
>>> +void vfio_cpr_load_device(struct VFIODevice *vbasedev);
>>>
>>> int vfio_cpr_group_get_device_fd(int d, const char *name);
>>>
>>> diff --git a/hw/vfio/cpr-iommufd.c b/hw/vfio/cpr-iommufd.c
>>> index 3e78265..2eca8a6 100644
>>> --- a/hw/vfio/cpr-iommufd.c
>>> +++ b/hw/vfio/cpr-iommufd.c
>>> @@ -7,6 +7,7 @@
>>> #include "qemu/osdep.h"
>>> #include "qapi/error.h"
>>> #include "hw/vfio/vfio-cpr.h"
>>> +#include "hw/vfio/vfio-device.h"
>>> #include "migration/blocker.h"
>>> #include "migration/cpr.h"
>>> #include "migration/migration.h"
>>> @@ -14,7 +15,88 @@
>>> #include "system/iommufd.h"
>>> #include "vfio-iommufd.h"
>>>
>>> -const VMStateDescription vmstate_cpr_vfio_devices;  /* TBD in a later
>patch */
>>> +typedef struct CprVFIODevice {
>>> +    char *name;
>>> +    unsigned int namelen;
>>> +    uint32_t ioas_id;
>>> +    int devid;
>>> +    uint32_t hwpt_id;
>>> +    QLIST_ENTRY(CprVFIODevice) next;
>>> +} CprVFIODevice;
>>> +
>>> +static const VMStateDescription vmstate_cpr_vfio_device = {
>>> +    .name = "cpr vfio device",
>>> +    .version_id = 1,
>>> +    .minimum_version_id = 1,
>>> +    .fields = (VMStateField[]) {
>>> +        VMSTATE_UINT32(namelen, CprVFIODevice),
>>> +        VMSTATE_VBUFFER_ALLOC_UINT32(name, CprVFIODevice, 0,
>NULL,
>>> namelen),
>>> +        VMSTATE_INT32(devid, CprVFIODevice),
>>> +        VMSTATE_UINT32(ioas_id, CprVFIODevice),
>>> +        VMSTATE_UINT32(hwpt_id, CprVFIODevice),
>>> +        VMSTATE_END_OF_LIST()
>>> +    }
>>> +};
>>> +
>>> +const VMStateDescription vmstate_cpr_vfio_devices = {
>>> +    .name = CPR_STATE "/vfio devices",
>>> +    .version_id = 1,
>>> +    .minimum_version_id = 1,
>>> +    .fields = (const VMStateField[]){
>>> +        VMSTATE_QLIST_V(vfio_devices, CprState, 1,
>vmstate_cpr_vfio_device,
>>> +                        CprVFIODevice, next),
>>> +        VMSTATE_END_OF_LIST()
>>> +    }
>>> +};
>>> +
>>> +static void vfio_cpr_save_device(VFIODevice *vbasedev)
>>> +{
>>> +    CprVFIODevice *elem = g_new0(CprVFIODevice, 1);
>>> +
>>> +    elem->name = g_strdup(vbasedev->name);
>>> +    elem->namelen = strlen(vbasedev->name) + 1;
>>> +    elem->ioas_id = vbasedev->cpr.ioas_id;
>>> +    elem->devid = vbasedev->devid;
>>> +    elem->hwpt_id = vbasedev->cpr.hwpt_id;
>>> +    QLIST_INSERT_HEAD(&cpr_state.vfio_devices, elem, next);
>>> +}
>>> +
>>> +static CprVFIODevice *find_device(const char *name)
>>> +{
>>> +    CprVFIODeviceList *head = &cpr_state.vfio_devices;
>>> +    CprVFIODevice *elem;
>>> +
>>> +    QLIST_FOREACH(elem, head, next) {
>>> +        if (!strcmp(elem->name, name)) {
>>> +            return elem;
>>> +        }
>>> +    }
>>> +    return NULL;
>>> +}
>>> +
>>> +static void vfio_cpr_delete_device(const char *name)
>>> +{
>>> +    CprVFIODevice *elem = find_device(name);
>>> +
>>> +    if (elem) {
>>> +        QLIST_REMOVE(elem, next);
>>> +        g_free(elem->name);
>>> +        g_free(elem);
>>> +    }
>>> +}
>>> +
>>> +static bool vfio_cpr_find_device(VFIODevice *vbasedev)
>>
>> Better to rename as vfio_cpr_load_device
>
>This is already called by a function named vfio_cpr_load_device.
>The usage is the same as cpr_find_fd, so "find" is a consistent name.

I thought this is find and load. This is trival, I'm ok with current change.
>
>>> +{
>>> +    CprVFIODevice *elem = find_device(vbasedev->name);
>>> +
>>> +    if (elem) {
>>> +        vbasedev->cpr.ioas_id = elem->ioas_id;
>>> +        vbasedev->devid = elem->devid;
>>> +        vbasedev->cpr.hwpt_id = elem->hwpt_id;
>>> +        return true;
>>> +    }
>>> +    return false;
>>> +}
>>>
>>> static bool vfio_cpr_supported(IOMMUFDBackend *be, Error **errp)
>>> {
>>> @@ -79,8 +161,20 @@ void
>>> vfio_iommufd_cpr_unregister_container(VFIOIOMMUFDContainer
>*container)
>>>
>>> void vfio_iommufd_cpr_register_device(VFIODevice *vbasedev)
>>> {
>>> +    if (!cpr_is_incoming()) {
>>> +        vfio_cpr_save_device(vbasedev);
>>> +    }
>>> }
>>>
>>> void vfio_iommufd_cpr_unregister_device(VFIODevice *vbasedev)
>>> {
>>> +    vfio_cpr_delete_device(vbasedev->name);
>>> +}
>>> +
>>> +void vfio_cpr_load_device(VFIODevice *vbasedev)
>>> +{
>>> +    if (cpr_is_incoming()) {
>>> +        bool ret = vfio_cpr_find_device(vbasedev);
>>> +        g_assert(ret);
>>> +    }
>>> }
>>> diff --git a/hw/vfio/iommufd.c b/hw/vfio/iommufd.c
>>> index ff291be..f0d57ea 100644
>>> --- a/hw/vfio/iommufd.c
>>> +++ b/hw/vfio/iommufd.c
>>> @@ -515,6 +515,8 @@ static bool iommufd_cdev_attach(const char
>*name,
>>> VFIODevice *vbasedev,
>>>      const VFIOIOMMUClass *iommufd_vioc =
>>>
>>>
>VFIO_IOMMU_CLASS(object_class_by_name(TYPE_VFIO_IOMMU_IOMMUFD
>));
>>>
>>> +    vfio_cpr_load_device(vbasedev);
>>
>> This can be open coded.
>
>vfio_cpr_load_device grows in patch "preserve descriptors", so I would
>rather keep it closed.
>
>- Steve
>
>>> +
>>>      if (vbasedev->fd < 0) {
>>>          devfd = iommufd_cdev_getfd(vbasedev->sysfsdev, errp);
>>>          if (devfd < 0) {
>>> --
>>> 1.8.3.1
>>

OK.

Reviewed-by: Zhenzhong Duan <zhenzhong.d...@intel.com>

Thanks
Zhenzhong

Reply via email to