qemu-kvm/kvm-migration-cpr-exec-save-and-load.patch
Miroslav Rezanina 085da1e81c * Tue May 26 2026 Miroslav Rezanina <mrezanin@redhat.com> - 10.1.0-19
- kvm-vmstate-Introduce-VMSTATE_VARRAY_INT32_ALLOC.patch [RHEL-174858]
- kvm-target-arm-Move-compare_u64-to-helper.c.patch [RHEL-174858]
- kvm-target-arm-Convert-init_cpreg_list-to-g_hash_table_f.patch [RHEL-174858]
- kvm-target-arm-machine-Use-VMSTATE_VARRAY_INT32_ALLOC-fo.patch [RHEL-174858]
- kvm-target-arm-kvm-Export-kvm_print_register_name.patch [RHEL-174858]
- kvm-target-arm-kvm-Tweak-print_register_name-for-arm64-s.patch [RHEL-174858]
- kvm-target-arm-machine-Trace-cpreg-names-which-do-not-ma.patch [RHEL-174858]
- kvm-target-arm-machine-Trace-all-register-mismatches.patch [RHEL-174858]
- kvm-target-arm-machine-Fix-detection-of-unknown-incoming.patch [RHEL-174858]
- kvm-target-arm-cpu-Introduce-the-infrastructure-for-cpre.patch [RHEL-174858]
- kvm-target-arm-machine-Handle-ToleranceNotOnBothEnds-mig.patch [RHEL-174858]
- kvm-target-arm-machine-Handle-ToleranceOnlySrcTestValue-.patch [RHEL-174858]
- kvm-target-arm-cpu64-Mitigate-migration-failures-due-to-.patch [RHEL-174858]
- kvm-target-arm-cpu64-Define-cpreg-migration-tolerance-fo.patch [RHEL-174858]
- kvm-target-arm-helper-Define-cpreg-migration-tolerance-f.patch [RHEL-174858]
- kvm-Revert-target-arm-Reinstate-bogus-AArch32-DBGDTRTX-r.patch [RHEL-174858]
- kvm-hw-pci-host-gpex-acpi-Fix-_DSM-function-0-support-re.patch [RHEL-138494]
- kvm-vfio-scsi-ui-Error-check-qio_channel_socket_connect_.patch [RHEL-138494]
- kvm-vfio-igd-Enable-quirks-when-IGD-is-not-the-primary-d.patch [RHEL-138494]
- kvm-vfio-Remove-vfio-amd-xgbe-device.patch [RHEL-138494]
- kvm-vfio-Remove-vfio-calxeda-xgmac-device.patch [RHEL-138494]
- kvm-hw-arm-virt-Include-system-system.h.patch [RHEL-138494]
- kvm-vfio-Remove-vfio-platform.patch [RHEL-138494]
- kvm-vfio-Move-vfio-region.h-under-hw-vfio.patch [RHEL-138494]
- kvm-vfio-container-set-error-on-cpr-failure.patch [RHEL-138494]
- kvm-vfio-Report-an-error-when-the-dma_max_mappings-limit.patch [RHEL-138494]
- kvm-hw-vfio-user-add-x-pci-class-code.patch [RHEL-138494]
- kvm-vfio-Introduce-helper-vfio_pci_from_vfio_device.patch [RHEL-138494]
- kvm-vfio-vfio-container-base.h-update-VFIOContainerBase-.patch [RHEL-138494]
- kvm-vfio-vfio-container.h-update-VFIOContainer-declarati.patch [RHEL-138494]
- kvm-hw-vfio-cpr-legacy.c-use-QOM-casts-where-appropriate.patch [RHEL-138494]
- kvm-hw-vfio-container.c-use-QOM-casts-where-appropriate.patch [RHEL-138494]
- kvm-vfio-spapr.c-use-QOM-casts-where-appropriate.patch [RHEL-138494]
- kvm-vfio-vfio-container.h-rename-VFIOContainer-bcontaine.patch [RHEL-138494]
- kvm-vfio-user-container.h-update-VFIOUserContainer-decla.patch [RHEL-138494]
- kvm-vfio-container.c-use-QOM-casts-where-appropriate.patch [RHEL-138494]
- kvm-vfio-user-container.h-rename-VFIOUserContainer-bcont.patch [RHEL-138494]
- kvm-vfio-user-pci.c-update-VFIOUserPCIDevice-declaration.patch [RHEL-138494]
- kvm-vfio-user-pci.c-use-QOM-casts-where-appropriate.patch [RHEL-138494]
- kvm-vfio-user-pci.c-rename-VFIOUserPCIDevice-device-fiel.patch [RHEL-138494]
- kvm-vfio-pci.h-update-VFIOPCIDevice-declaration.patch [RHEL-138494]
- kvm-vfio-pci.c-use-QOM-casts-where-appropriate.patch [RHEL-138494]
- kvm-vfio-pci-quirks.c-use-QOM-casts-where-appropriate.patch [RHEL-138494]
- kvm-vfio-cpr.c-use-QOM-casts-where-appropriate.patch [RHEL-138494]
- kvm-vfio-igd.c-use-QOM-casts-where-appropriate.patch [RHEL-138494]
- kvm-vfio-user-pci.c-use-QOM-casts-where-appropriate2.patch [RHEL-138494]
- kvm-vfio-pci.h-rename-VFIOPCIDevice-pdev-field-to-parent.patch [RHEL-138494]
- kvm-treewide-handle-result-of-qio_channel_set_blocking.patch [RHEL-138494]
- kvm-vfio-pci-Do-not-unparent-in-instance_finalize.patch [RHEL-138494]
- kvm-vfio-Do-not-unparent-in-instance_finalize.patch [RHEL-138494]
- kvm-include-hw-vfio-vfio-container.h-rename-VFIOContaine.patch [RHEL-138494]
- kvm-include-hw-vfio-vfio-container-base.h-rename-VFIOCon.patch [RHEL-138494]
- kvm-include-hw-vfio-vfio-container.h-rename-file-to-vfio.patch [RHEL-138494]
- kvm-include-hw-vfio-vfio-container-base.h-rename-file-to.patch [RHEL-138494]
- kvm-hw-vfio-container.c-rename-file-to-container-legacy..patch [RHEL-138494]
- kvm-hw-vfio-container-base.c-rename-file-to-container.c.patch [RHEL-138494]
- kvm-vfio-iommufd.c-use-QOM-casts-where-appropriate.patch [RHEL-138494]
- kvm-vfio-cpr-iommufd.c-use-QOM-casts-where-appropriate.patch [RHEL-138494]
- kvm-vfio-vfio-iommufd.h-rename-VFIOContainer-bcontainer-.patch [RHEL-138494]
- kvm-vfio-spapr.c-use-QOM-casts-where-appropriate2.patch [RHEL-138494]
- kvm-vfio-spapr.c-rename-VFIOContainer-bcontainer-field-t.patch [RHEL-138494]
- kvm-vfio-pci.c-rename-vfio_instance_init-to-vfio_pci_ini.patch [RHEL-138494]
- kvm-vfio-pci.c-rename-vfio_instance_finalize-to-vfio_pci.patch [RHEL-138494]
- kvm-vfio-pci.c-rename-vfio_pci_dev_class_init-to-vfio_pc.patch [RHEL-138494]
- kvm-vfio-pci.c-rename-vfio_pci_dev_info-to-vfio_pci_info.patch [RHEL-138494]
- kvm-s390x-s390-pci-vfio.c-use-QOM-casts-where-appropriat.patch [RHEL-138494]
- kvm-hw-vfio-types.h-rename-TYPE_VFIO_PCI_BASE-to-TYPE_VF.patch [RHEL-138494]
- kvm-vfio-pci.c-rename-vfio_pci_base_dev_class_init-to-vf.patch [RHEL-138494]
- kvm-vfio-pci.c-rename-vfio_pci_base_dev_info-to-vfio_pci.patch [RHEL-138494]
- kvm-vfio-pci.c-rename-vfio_pci_dev_properties-to-vfio_pc.patch [RHEL-138494]
- kvm-vfio-pci.c-rename-vfio_pci_dev_nohotplug_properties-.patch [RHEL-138494]
- kvm-vfio-pci.c-rename-vfio_pci_nohotplug_dev_class_init-.patch [RHEL-138494]
- kvm-vfio-pci.c-rename-vfio_pci_nohotplug_dev_info-to-vfi.patch [RHEL-138494]
- kvm-vfio-user-pci.c-rename-vfio_user_pci_dev_class_init-.patch [RHEL-138494]
- kvm-vfio-user-pci.c-rename-vfio_user_pci_dev_properties-.patch [RHEL-138494]
- kvm-vfio-user-pci.c-rename-vfio_user_instance_init-to-vf.patch [RHEL-138494]
- kvm-vfio-user-pci.c-rename-vfio_user_instance_finalize-t.patch [RHEL-138494]
- kvm-vfio-user-pci.c-rename-vfio_user_pci_dev_info-to-vfi.patch [RHEL-138494]
- kvm-include-hw-vfio-vfio-device.h-fix-include-header-gua.patch [RHEL-138494]
- kvm-vfio-Remove-workaround-for-kernel-DMA-unmap-overflow.patch [RHEL-138494]
- kvm-system-iommufd-Use-uint64_t-type-for-IOVA-mapping-si.patch [RHEL-138494]
- kvm-hw-vfio-Reorder-vfio_container_query_dirty_bitmap-tr.patch [RHEL-138494]
- kvm-hw-vfio-Avoid-ram_addr_t-in-vfio_container_query_dir.patch [RHEL-138494]
- kvm-hw-vfio-Use-uint64_t-for-IOVA-mapping-size-in-vfio_c.patch [RHEL-138494]
- kvm-migration-push-Error-errp-into-vmstate_subsection_lo.patch [RHEL-138494]
- kvm-migration-push-Error-errp-into-vmstate_load_state.patch [RHEL-138494]
- kvm-migration-Remove-error-variant-of-vmstate_save_state.patch [RHEL-138494]
- kvm-migration-multi-mode-notifier.patch [RHEL-138494]
- kvm-migration-add-cpr_walk_fd.patch [RHEL-138494]
- kvm-oslib-qemu_clear_cloexec.patch [RHEL-138494]
- kvm-migration-cpr-exec-command-parameter.patch [RHEL-138494]
- kvm-migration-cpr-exec-save-and-load.patch [RHEL-138494]
- kvm-migration-cpr-exec-mode.patch [RHEL-138494]
- kvm-migration-cpr-exec-docs.patch [RHEL-138494]
- kvm-vfio-cpr-exec-mode.patch [RHEL-138494]
- kvm-hw-vfio-listener-Include-missing-exec-target_page.h-.patch [RHEL-138494]
- kvm-hw-Remove-unnecessary-system-ram_addr.h-header.patch [RHEL-138494]
- kvm-vfio-container-Remap-only-populated-parts-in-a-secti.patch [RHEL-138494]
- kvm-vfio-cpr-legacy-drop-an-erroneous-assert.patch [RHEL-138494]
- kvm-vfio-iommufd-Set-cpr.ioas_id-on-source-side-for-CPR-.patch [RHEL-138494]
- kvm-vfio-iommufd-Restore-vbasedev-s-reference-to-hwpt-af.patch [RHEL-138494]
- kvm-vfio-container-Support-unmap-all-in-one-ioctl.patch [RHEL-138494]
- kvm-vfio-iommufd-Support-unmap-all-in-one-ioctl.patch [RHEL-138494]
- kvm-vfio-listener-Add-an-assertion-for-unmap_all.patch [RHEL-138494]
- kvm-vfio-Clean-up-includes.patch [RHEL-138494]
- kvm-migration-set-correct-list-pointer-when-removing-not.patch [RHEL-138494]
- kvm-vfio-user-simplify-vfio_user_process.patch [RHEL-138494]
- kvm-vfio-user-clarify-partial-message-handling.patch [RHEL-138494]
- kvm-vfio-user-refactor-out-header-handling.patch [RHEL-138494]
- kvm-vfio-user-simplify-vfio_user_recv_one.patch [RHEL-138494]
- kvm-vfio-user-recycle-msg-on-failure.patch [RHEL-138494]
- kvm-include-hw-hyperv-Remove-unused-struct-mshv_vp_regis.patch [RHEL-138494]
- kvm-linux-headers-Update-to-Linux-v6.18-rc3.patch [RHEL-138494]
- kvm-linux-headers-Update-to-Linux-v6.19-rc1.patch [RHEL-138494]
- kvm-hw-vfio-Add-helper-to-retrieve-device-feature.patch [RHEL-138494]
- kvm-hw-vfio-region-Create-dmabuf-for-PCI-BAR-per-region.patch [RHEL-138494]
- Resolves: RHEL-174858
  ([rhel10] Backport qemu cross-kernel migration mitigation series)
- Resolves: RHEL-138494
  (NVIDIA:Grace-Hopper:Backport vfio: Add DMABUF support for PCI BAR regions - RHEL 10.3)
2026-05-26 13:55:58 +02:00

167 lines
4.7 KiB
Diff

From 9eba869ae9f22f7c9470ca84b01bc775441ffa77 Mon Sep 17 00:00:00 2001
From: Steve Sistare <steven.sistare@oracle.com>
Date: Wed, 1 Oct 2025 08:33:57 -0700
Subject: [PATCH 092/116] migration: cpr-exec save and load
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
RH-Author: Rodolfo Vick <None>
RH-MergeRequest: 486: Add DMABUF support
RH-Jira: RHEL-138494
RH-Acked-by: Cédric Le Goater <clg@redhat.com>
RH-Acked-by: Eric Auger <eric.auger@redhat.com>
RH-Commit: [76/100] dccfce1a851364d8a3fc15ccc537277fd2f3b55b (rovick1/qemu-kvm)
To preserve CPR state across exec, create a QEMUFile based on a memfd, and
keep the memfd open across exec. Save the value of the memfd in an
environment variable so post-exec QEMU can find it.
These new functions are called in a subsequent patch.
Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
Link: https://lore.kernel.org/r/1759332851-370353-6-git-send-email-steven.sistare@oracle.com
[peterx: fix build for Windows]
Signed-off-by: Peter Xu <peterx@redhat.com>
---
include/migration/cpr.h | 5 +++
migration/cpr-exec.c | 99 +++++++++++++++++++++++++++++++++++++++++
migration/meson.build | 1 +
3 files changed, 105 insertions(+)
create mode 100644 migration/cpr-exec.c
diff --git a/include/migration/cpr.h b/include/migration/cpr.h
index 2b074d7a65..b84389ff04 100644
--- a/include/migration/cpr.h
+++ b/include/migration/cpr.h
@@ -53,4 +53,9 @@ int cpr_get_fd_param(const char *name, const char *fdname, int index,
QEMUFile *cpr_transfer_output(MigrationChannel *channel, Error **errp);
QEMUFile *cpr_transfer_input(MigrationChannel *channel, Error **errp);
+QEMUFile *cpr_exec_output(Error **errp);
+QEMUFile *cpr_exec_input(Error **errp);
+void cpr_exec_persist_state(QEMUFile *f);
+bool cpr_exec_has_state(void);
+void cpr_exec_unpersist_state(void);
#endif
diff --git a/migration/cpr-exec.c b/migration/cpr-exec.c
new file mode 100644
index 0000000000..81d84425e1
--- /dev/null
+++ b/migration/cpr-exec.c
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2021-2025 Oracle and/or its affiliates.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "qemu/osdep.h"
+#include "qemu/cutils.h"
+#include "qemu/memfd.h"
+#include "qapi/error.h"
+#include "io/channel-file.h"
+#include "io/channel-socket.h"
+#include "migration/cpr.h"
+#include "migration/qemu-file.h"
+#include "migration/misc.h"
+#include "migration/vmstate.h"
+#include "system/runstate.h"
+
+#define CPR_EXEC_STATE_NAME "QEMU_CPR_EXEC_STATE"
+
+static QEMUFile *qemu_file_new_fd_input(int fd, const char *name)
+{
+ g_autoptr(QIOChannelFile) fioc = qio_channel_file_new_fd(fd);
+ QIOChannel *ioc = QIO_CHANNEL(fioc);
+ qio_channel_set_name(ioc, name);
+ return qemu_file_new_input(ioc);
+}
+
+static QEMUFile *qemu_file_new_fd_output(int fd, const char *name)
+{
+ g_autoptr(QIOChannelFile) fioc = qio_channel_file_new_fd(fd);
+ QIOChannel *ioc = QIO_CHANNEL(fioc);
+ qio_channel_set_name(ioc, name);
+ return qemu_file_new_output(ioc);
+}
+
+void cpr_exec_persist_state(QEMUFile *f)
+{
+ QIOChannelFile *fioc = QIO_CHANNEL_FILE(qemu_file_get_ioc(f));
+ int mfd = dup(fioc->fd);
+ char val[16];
+
+ /* Remember mfd in environment for post-exec load */
+ qemu_clear_cloexec(mfd);
+ snprintf(val, sizeof(val), "%d", mfd);
+ g_setenv(CPR_EXEC_STATE_NAME, val, 1);
+}
+
+static int cpr_exec_find_state(void)
+{
+ const char *val = g_getenv(CPR_EXEC_STATE_NAME);
+ int mfd;
+
+ assert(val);
+ g_unsetenv(CPR_EXEC_STATE_NAME);
+ assert(!qemu_strtoi(val, NULL, 10, &mfd));
+ return mfd;
+}
+
+bool cpr_exec_has_state(void)
+{
+ return g_getenv(CPR_EXEC_STATE_NAME) != NULL;
+}
+
+void cpr_exec_unpersist_state(void)
+{
+ int mfd;
+ const char *val = g_getenv(CPR_EXEC_STATE_NAME);
+
+ g_unsetenv(CPR_EXEC_STATE_NAME);
+ assert(val);
+ assert(!qemu_strtoi(val, NULL, 10, &mfd));
+ close(mfd);
+}
+
+QEMUFile *cpr_exec_output(Error **errp)
+{
+ int mfd;
+
+#ifdef CONFIG_LINUX
+ mfd = qemu_memfd_create(CPR_EXEC_STATE_NAME, 0, false, 0, 0, errp);
+#else
+ mfd = -1;
+#endif
+
+ if (mfd < 0) {
+ return NULL;
+ }
+
+ return qemu_file_new_fd_output(mfd, CPR_EXEC_STATE_NAME);
+}
+
+QEMUFile *cpr_exec_input(Error **errp)
+{
+ int mfd = cpr_exec_find_state();
+
+ lseek(mfd, 0, SEEK_SET);
+ return qemu_file_new_fd_input(mfd, CPR_EXEC_STATE_NAME);
+}
diff --git a/migration/meson.build b/migration/meson.build
index 276da3be5a..6087ccc733 100644
--- a/migration/meson.build
+++ b/migration/meson.build
@@ -16,6 +16,7 @@ system_ss.add(files(
'channel-block.c',
'cpr.c',
'cpr-transfer.c',
+ 'cpr-exec.c',
'cpu-throttle.c',
'dirtyrate.c',
'exec.c',
--
2.52.0