>-----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?

Zhenzhong

Reply via email to