>-----Original Message-----
>From: Steven Sistare <steven.sist...@oracle.com>
>Subject: Re: [PATCH V5 04/38] vfio/container: preserve descriptors
>
>On 6/23/2025 5:07 AM, Duan, Zhenzhong wrote:
>>> -----Original Message-----
>>> From: Steve Sistare <steven.sist...@oracle.com>
>>> Subject: [PATCH V5 04/38] vfio/container: preserve descriptors
>>>
>>> At vfio creation time, save the value of vfio container, group, and device
>>> descriptors in CPR state.  On qemu restart, vfio_realize() finds and uses
>>> the saved descriptors.
>>>
>>> During reuse, device and iommu state is already configured, so operations
>>> in vfio_realize that would modify the configuration, such as vfio ioctl's,
>>> are skipped.  The result is that vfio_realize constructs qemu data
>>> structures that reflect the current state of the device.
>>>
>>> Signed-off-by: Steve Sistare <steven.sist...@oracle.com>
>>> Reviewed-by: Cédric Le Goater <c...@redhat.com>
>>> Reviewed-by: Zhenzhong Duan <zhenzhong.d...@intel.com>
>>> ---
>>> include/hw/vfio/vfio-cpr.h |  6 +++++
>>> hw/vfio/container.c        | 67
>+++++++++++++++++++++++++++++++++++----------
>>> -
>>> hw/vfio/cpr-legacy.c       | 42 +++++++++++++++++++++++++++++
>>> 3 files changed, 100 insertions(+), 15 deletions(-)
>>>
>>> diff --git a/include/hw/vfio/vfio-cpr.h b/include/hw/vfio/vfio-cpr.h
>>> index d4e0bd5..5a2e5f6 100644
>>> --- a/include/hw/vfio/vfio-cpr.h
>>> +++ b/include/hw/vfio/vfio-cpr.h
>>> @@ -13,6 +13,7 @@
>>>
>>> struct VFIOContainer;
>>> struct VFIOContainerBase;
>>> +struct VFIOGroup;
>>>
>>> typedef struct VFIOContainerCPR {
>>>      Error *blocker;
>>> @@ -30,4 +31,9 @@ bool vfio_cpr_register_container(struct
>VFIOContainerBase
>>> *bcontainer,
>>>                                   Error **errp);
>>> void vfio_cpr_unregister_container(struct VFIOContainerBase
>*bcontainer);
>>>
>>> +int vfio_cpr_group_get_device_fd(int d, const char *name);
>>> +
>>> +bool vfio_cpr_container_match(struct VFIOContainer *container,
>>> +                              struct VFIOGroup *group, int fd);
>>> +
>>> #endif /* HW_VFIO_VFIO_CPR_H */
>>> diff --git a/hw/vfio/container.c b/hw/vfio/container.c
>>> index 93cdf80..5caae4c 100644
>>> --- a/hw/vfio/container.c
>>> +++ b/hw/vfio/container.c
>>> @@ -31,6 +31,8 @@
>>> #include "system/reset.h"
>>> #include "trace.h"
>>> #include "qapi/error.h"
>>> +#include "migration/cpr.h"
>>> +#include "migration/blocker.h"
>>> #include "pci.h"
>>> #include "hw/vfio/vfio-container.h"
>>> #include "vfio-helpers.h"
>>> @@ -425,7 +427,12 @@ static VFIOContainer *vfio_create_container(int
>fd,
>>> VFIOGroup *group,
>>>          return NULL;
>>>      }
>>>
>>> -    if (!vfio_set_iommu(fd, group->fd, &iommu_type, errp)) {
>>> +    /*
>>> +     * During CPR, just set the container type and skip the ioctls, as the
>>> +     * container and group are already configured in the kernel.
>>> +     */
>>> +    if (!cpr_is_incoming() &&
>>> +        !vfio_set_iommu(fd, group->fd, &iommu_type, errp)) {
>>>          return NULL;
>>>      }
>>>
>>> @@ -592,6 +599,11 @@ static bool
>vfio_container_group_add(VFIOContainer
>>> *container, VFIOGroup *group,
>>>      group->container = container;
>>>      QLIST_INSERT_HEAD(&container->group_list, group,
>container_next);
>>>      vfio_group_add_kvm_device(group);
>>> +    /*
>>> +     * Remember the container fd for each group, so we can attach to
>the same
>>> +     * container after CPR.
>>> +     */
>>> +    cpr_resave_fd("vfio_container_for_group", group->groupid,
>container->fd);
>>
>> I know this is already merged. Just out of curious, It looks cpr_save_fd is
>enough?
>
>vfio_container_group_add is called from multiple places.  In some, we know
>that the fd
>is being saved for the first time, in others we do not know.  resave avoids
>creating
>a duplicate entry.

IIUC, vfio_container_group_add is called only once for each group. But it's 
harmless to call cpr_resave_fd() here. I'm fine to leave it as is.

Thanks
Zhenzhong

Reply via email to