[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2 06/17] migration: Add save_live_complete_precopy_{begin, end}
|
From: |
Maciej S. Szmigiero |
|
Subject: |
[PATCH v2 06/17] migration: Add save_live_complete_precopy_{begin, end} handlers |
|
Date: |
Tue, 27 Aug 2024 19:54:25 +0200 |
From: "Maciej S. Szmigiero" <maciej.szmigiero@oracle.com>
These SaveVMHandlers help device provide its own asynchronous
transmission of the remaining data at the end of a precopy phase.
In this use case the save_live_complete_precopy_begin handler might
be used to mark the stream boundary before proceeding with asynchronous
transmission of the remaining data while the
save_live_complete_precopy_end handler might be used to mark the
stream boundary after performing the asynchronous transmission.
Signed-off-by: Maciej S. Szmigiero <maciej.szmigiero@oracle.com>
---
include/migration/register.h | 36 ++++++++++++++++++++++++++++++++++++
migration/savevm.c | 35 +++++++++++++++++++++++++++++++++++
2 files changed, 71 insertions(+)
diff --git a/include/migration/register.h b/include/migration/register.h
index f60e797894e5..9de123252edf 100644
--- a/include/migration/register.h
+++ b/include/migration/register.h
@@ -103,6 +103,42 @@ typedef struct SaveVMHandlers {
*/
int (*save_live_complete_precopy)(QEMUFile *f, void *opaque);
+ /**
+ * @save_live_complete_precopy_begin
+ *
+ * Called at the end of a precopy phase, before all
+ * @save_live_complete_precopy handlers and before launching
+ * all @save_live_complete_precopy_thread threads.
+ * The handler might, for example, mark the stream boundary before
+ * proceeding with asynchronous transmission of the remaining data via
+ * @save_live_complete_precopy_thread.
+ * When postcopy is enabled, devices that support postcopy will skip this
step.
+ *
+ * @f: QEMUFile where the handler can synchronously send data before
returning
+ * @idstr: this device section idstr
+ * @instance_id: this device section instance_id
+ * @opaque: data pointer passed to register_savevm_live()
+ *
+ * Returns zero to indicate success and negative for error
+ */
+ int (*save_live_complete_precopy_begin)(QEMUFile *f,
+ char *idstr, uint32_t instance_id,
+ void *opaque);
+ /**
+ * @save_live_complete_precopy_end
+ *
+ * Called at the end of a precopy phase, after @save_live_complete_precopy
+ * handlers and after all @save_live_complete_precopy_thread threads have
+ * finished. When postcopy is enabled, devices that support postcopy will
+ * skip this step.
+ *
+ * @f: QEMUFile where the handler can synchronously send data before
returning
+ * @opaque: data pointer passed to register_savevm_live()
+ *
+ * Returns zero to indicate success and negative for error
+ */
+ int (*save_live_complete_precopy_end)(QEMUFile *f, void *opaque);
+
/* This runs both outside and inside the BQL. */
/**
diff --git a/migration/savevm.c b/migration/savevm.c
index 6bb404b9c86f..d43acbbf20cf 100644
--- a/migration/savevm.c
+++ b/migration/savevm.c
@@ -1496,6 +1496,27 @@ int qemu_savevm_state_complete_precopy_iterable(QEMUFile
*f, bool in_postcopy)
SaveStateEntry *se;
int ret;
+ QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
+ if (!se->ops || (in_postcopy && se->ops->has_postcopy &&
+ se->ops->has_postcopy(se->opaque)) ||
+ !se->ops->save_live_complete_precopy_begin) {
+ continue;
+ }
+
+ save_section_header(f, se, QEMU_VM_SECTION_END);
+
+ ret = se->ops->save_live_complete_precopy_begin(f,
+ se->idstr,
se->instance_id,
+ se->opaque);
+
+ save_section_footer(f, se);
+
+ if (ret < 0) {
+ qemu_file_set_error(f, ret);
+ return -1;
+ }
+ }
+
QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
if (!se->ops ||
(in_postcopy && se->ops->has_postcopy &&
@@ -1527,6 +1548,20 @@ int qemu_savevm_state_complete_precopy_iterable(QEMUFile
*f, bool in_postcopy)
end_ts_each - start_ts_each);
}
+ QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
+ if (!se->ops || (in_postcopy && se->ops->has_postcopy &&
+ se->ops->has_postcopy(se->opaque)) ||
+ !se->ops->save_live_complete_precopy_end) {
+ continue;
+ }
+
+ ret = se->ops->save_live_complete_precopy_end(f, se->opaque);
+ if (ret < 0) {
+ qemu_file_set_error(f, ret);
+ return -1;
+ }
+ }
+
trace_vmstate_downtime_checkpoint("src-iterable-saved");
return 0;
- [PATCH v2 00/17] Multifd 🔀 device state transfer support with VFIO consumer, Maciej S. Szmigiero, 2024/08/27
- [PATCH v2 01/17] vfio/migration: Add save_{iterate, complete_precopy}_started trace events, Maciej S. Szmigiero, 2024/08/27
- [PATCH v2 04/17] thread-pool: Add a DestroyNotify parameter to thread_pool_submit{, _aio)(), Maciej S. Szmigiero, 2024/08/27
- [PATCH v2 02/17] migration/ram: Add load start trace event, Maciej S. Szmigiero, 2024/08/27
- [PATCH v2 03/17] migration/multifd: Zero p->flags before starting filling a packet, Maciej S. Szmigiero, 2024/08/27
- [PATCH v2 06/17] migration: Add save_live_complete_precopy_{begin, end} handlers,
Maciej S. Szmigiero <=
- [PATCH v2 08/17] migration: Add load_finish handler and associated functions, Maciej S. Szmigiero, 2024/08/27
- [PATCH v2 07/17] migration: Add qemu_loadvm_load_state_buffer() and its handler, Maciej S. Szmigiero, 2024/08/27
- [PATCH v2 05/17] thread-pool: Implement non-AIO (generic) pool support, Maciej S. Szmigiero, 2024/08/27
- [PATCH v2 09/17] migration/multifd: Device state transfer support - receive side, Maciej S. Szmigiero, 2024/08/27
- [PATCH v2 10/17] migration/multifd: Convert multifd_send()::next_channel to atomic, Maciej S. Szmigiero, 2024/08/27