>-----Original Message-----
>From: Steve Sistare <steven.sist...@oracle.com>
>Subject: [PATCH V4 09/43] vfio/container: register container for cpr
>
>Register a legacy container for cpr-transfer, replacing the generic CPR
>register call with a more specific legacy container register call.  Add a
>blocker if the kernel does not support VFIO_UPDATE_VADDR or
>VFIO_UNMAP_ALL.
>
>This is mostly boiler plate.  The fields to to saved and restored are added
>in subsequent patches.
>
>Signed-off-by: Steve Sistare <steven.sist...@oracle.com>
>---
> include/hw/vfio/vfio-container.h |  2 ++
> include/hw/vfio/vfio-cpr.h       | 15 +++++++++
> hw/vfio/container.c              |  6 ++--
> hw/vfio/cpr-legacy.c             | 69
>++++++++++++++++++++++++++++++++++++++++
> hw/vfio/cpr.c                    |  5 ++-
> hw/vfio/meson.build              |  1 +
> 6 files changed, 92 insertions(+), 6 deletions(-)
> create mode 100644 hw/vfio/cpr-legacy.c
>
>diff --git a/include/hw/vfio/vfio-container.h 
>b/include/hw/vfio/vfio-container.h
>index afc498d..21e5807 100644
>--- a/include/hw/vfio/vfio-container.h
>+++ b/include/hw/vfio/vfio-container.h
>@@ -10,6 +10,7 @@
> #define HW_VFIO_CONTAINER_H
>
> #include "hw/vfio/vfio-container-base.h"
>+#include "hw/vfio/vfio-cpr.h"

Now that we have this change, may we remove #include of vfio-cpr.h in 
hw/vfio/container.c?
Maybe this belong to patch8?

>
> typedef struct VFIOContainer VFIOContainer;
> typedef struct VFIODevice VFIODevice;
>@@ -29,6 +30,7 @@ typedef struct VFIOContainer {
>     int fd; /* /dev/vfio/vfio, empowered by the attached groups */
>     unsigned iommu_type;
>     QLIST_HEAD(, VFIOGroup) group_list;
>+    VFIOContainerCPR cpr;
> } VFIOContainer;
>
> OBJECT_DECLARE_SIMPLE_TYPE(VFIOContainer, VFIO_IOMMU_LEGACY);
>diff --git a/include/hw/vfio/vfio-cpr.h b/include/hw/vfio/vfio-cpr.h
>index 750ea5b..d4e0bd5 100644
>--- a/include/hw/vfio/vfio-cpr.h
>+++ b/include/hw/vfio/vfio-cpr.h
>@@ -9,8 +9,23 @@
> #ifndef HW_VFIO_VFIO_CPR_H
> #define HW_VFIO_VFIO_CPR_H
>
>+#include "migration/misc.h"
>+
>+struct VFIOContainer;
> struct VFIOContainerBase;
>
>+typedef struct VFIOContainerCPR {
>+    Error *blocker;
>+} VFIOContainerCPR;
>+
>+
>+bool vfio_legacy_cpr_register_container(struct VFIOContainer *container,
>+                                        Error **errp);
>+void vfio_legacy_cpr_unregister_container(struct VFIOContainer *container);
>+
>+int vfio_cpr_reboot_notifier(NotifierWithReturn *notifier, MigrationEvent *e,
>+                             Error **errp);
>+
> bool vfio_cpr_register_container(struct VFIOContainerBase *bcontainer,
>                                  Error **errp);
> void vfio_cpr_unregister_container(struct VFIOContainerBase *bcontainer);
>diff --git a/hw/vfio/container.c b/hw/vfio/container.c
>index 0f948d0..7d2035c 100644
>--- a/hw/vfio/container.c
>+++ b/hw/vfio/container.c
>@@ -643,7 +643,7 @@ static bool vfio_container_connect(VFIOGroup *group,
>AddressSpace *as,
>     new_container = true;
>     bcontainer = &container->bcontainer;
>
>-    if (!vfio_cpr_register_container(bcontainer, errp)) {
>+    if (!vfio_legacy_cpr_register_container(container, errp)) {
>         goto fail;
>     }
>
>@@ -679,7 +679,7 @@ fail:
>         vioc->release(bcontainer);
>     }
>     if (new_container) {
>-        vfio_cpr_unregister_container(bcontainer);
>+        vfio_legacy_cpr_unregister_container(container);
>         object_unref(container);
>     }
>     if (fd >= 0) {
>@@ -720,7 +720,7 @@ static void vfio_container_disconnect(VFIOGroup *group)
>         VFIOAddressSpace *space = bcontainer->space;
>
>         trace_vfio_container_disconnect(container->fd);
>-        vfio_cpr_unregister_container(bcontainer);
>+        vfio_legacy_cpr_unregister_container(container);
>         close(container->fd);
>         object_unref(container);
>
>diff --git a/hw/vfio/cpr-legacy.c b/hw/vfio/cpr-legacy.c
>new file mode 100644
>index 0000000..419b9fb
>--- /dev/null
>+++ b/hw/vfio/cpr-legacy.c
>@@ -0,0 +1,69 @@
>+/*
>+ * Copyright (c) 2021-2025 Oracle and/or its affiliates.
>+ *
>+ * SPDX-License-Identifier: GPL-2.0-or-later
>+ */
>+
>+#include <sys/ioctl.h>
>+#include <linux/vfio.h>
>+#include "qemu/osdep.h"
>+#include "hw/vfio/vfio-container.h"
>+#include "hw/vfio/vfio-cpr.h"

Ditto.

>+#include "migration/blocker.h"
>+#include "migration/cpr.h"
>+#include "migration/migration.h"
>+#include "migration/vmstate.h"
>+#include "qapi/error.h"
>+
>+static bool vfio_cpr_supported(VFIOContainer *container, Error **errp)
>+{
>+    if (!ioctl(container->fd, VFIO_CHECK_EXTENSION, VFIO_UPDATE_VADDR)) {
>+        error_setg(errp, "VFIO container does not support VFIO_UPDATE_VADDR");
>+        return false;
>+
>+    } else if (!ioctl(container->fd, VFIO_CHECK_EXTENSION, VFIO_UNMAP_ALL)) {
>+        error_setg(errp, "VFIO container does not support VFIO_UNMAP_ALL");
>+        return false;
>+
>+    } else {
>+        return true;
>+    }
>+}
>+
>+static const VMStateDescription vfio_container_vmstate = {
>+    .name = "vfio-container",
>+    .version_id = 0,
>+    .minimum_version_id = 0,
>+    .needed = cpr_incoming_needed,
>+    .fields = (VMStateField[]) {
>+        VMSTATE_END_OF_LIST()
>+    }
>+};
>+
>+bool vfio_legacy_cpr_register_container(VFIOContainer *container, Error
>**errp)
>+{
>+    VFIOContainerBase *bcontainer = &container->bcontainer;
>+    Error **cpr_blocker = &container->cpr.blocker;
>+
>+    migration_add_notifier_mode(&bcontainer->cpr_reboot_notifier,
>+                                vfio_cpr_reboot_notifier,
>+                                MIG_MODE_CPR_REBOOT);
>+
>+    if (!vfio_cpr_supported(container, cpr_blocker)) {
>+        return migrate_add_blocker_modes(cpr_blocker, errp,
>+                                         MIG_MODE_CPR_TRANSFER, -1) == 0;
>+    }
>+
>+    vmstate_register(NULL, -1, &vfio_container_vmstate, container);
>+
>+    return true;
>+}
>+
>+void vfio_legacy_cpr_unregister_container(VFIOContainer *container)
>+{
>+    VFIOContainerBase *bcontainer = &container->bcontainer;
>+
>+    migration_remove_notifier(&bcontainer->cpr_reboot_notifier);
>+    migrate_del_blocker(&container->cpr.blocker);
>+    vmstate_unregister(NULL, &vfio_container_vmstate, container);
>+}
>diff --git a/hw/vfio/cpr.c b/hw/vfio/cpr.c
>index 0210e76..0e59612 100644
>--- a/hw/vfio/cpr.c
>+++ b/hw/vfio/cpr.c
>@@ -7,13 +7,12 @@
>
> #include "qemu/osdep.h"
> #include "hw/vfio/vfio-device.h"
>-#include "migration/misc.h"
> #include "hw/vfio/vfio-cpr.h"
> #include "qapi/error.h"
> #include "system/runstate.h"
>
>-static int vfio_cpr_reboot_notifier(NotifierWithReturn *notifier,
>-                                    MigrationEvent *e, Error **errp)
>+int vfio_cpr_reboot_notifier(NotifierWithReturn *notifier,
>+                             MigrationEvent *e, Error **errp)
> {
>     if (e->type == MIG_EVENT_PRECOPY_SETUP &&
>         !runstate_check(RUN_STATE_SUSPENDED) && !vm_get_suspended()) {
>diff --git a/hw/vfio/meson.build b/hw/vfio/meson.build
>index bccb050..73d29f9 100644
>--- a/hw/vfio/meson.build
>+++ b/hw/vfio/meson.build
>@@ -21,6 +21,7 @@ system_ss.add(when: 'CONFIG_VFIO_XGMAC', if_true:
>files('calxeda-xgmac.c'))
> system_ss.add(when: 'CONFIG_VFIO_AMD_XGBE', if_true: files('amd-xgbe.c'))
> system_ss.add(when: 'CONFIG_VFIO', if_true: files(
>   'cpr.c',
>+  'cpr-legacy.c',
>   'device.c',
>   'migration.c',
>   'migration-multifd.c',
>--
>1.8.3.1


Reply via email to