diff options
author | Peter Xu <peterx@redhat.com> | 2025-01-14 18:07:42 -0500 |
---|---|---|
committer | Fabiano Rosas <farosas@suse.de> | 2025-01-29 11:56:41 -0300 |
commit | 15c2ffa0b739fb40e448892ff0d0d49f99263530 (patch) | |
tree | 11a377eb3448a5ea66b51d50b042ad354cdb2c2c | |
parent | 46b0155ecf3e65ba1497a9eb35e7352c36ed6f31 (diff) | |
download | qemu-15c2ffa0b739fb40e448892ff0d0d49f99263530.zip qemu-15c2ffa0b739fb40e448892ff0d0d49f99263530.tar.gz qemu-15c2ffa0b739fb40e448892ff0d0d49f99263530.tar.bz2 |
migration: Unwrap qemu_savevm_state_complete_precopy() in postcopy
Postcopy invokes qemu_savevm_state_complete_precopy() twice for a long
time, and that caused way too much confusions. Let's clean this up and
make postcopy easier to read.
It's actually fairly straightforward: postcopy starts with saving
non-postcopiable iterables, then later it saves again with non-iterable
only. Move these two calls out makes everything much easier to follow.
Otherwise it's very unclear what qemu_savevm_state_complete_precopy() did
in either of the calls.
No functional change intended.
Signed-off-by: Peter Xu <peterx@redhat.com>
Tested-by: Jiri Denemark <jdenemar@redhat.com>
Reviewed-by: Juraj Marcin <jmarcin@redhat.com>
Link: https://lore.kernel.org/r/20250114230746.3268797-13-peterx@redhat.com
Signed-off-by: Fabiano Rosas <farosas@suse.de>
-rw-r--r-- | migration/migration.c | 13 | ||||
-rw-r--r-- | migration/savevm.c | 1 | ||||
-rw-r--r-- | migration/savevm.h | 1 |
3 files changed, 12 insertions, 3 deletions
diff --git a/migration/migration.c b/migration/migration.c index 72802d6..d29f744 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -2693,7 +2693,11 @@ static int postcopy_start(MigrationState *ms, Error **errp) * Cause any non-postcopiable, but iterative devices to * send out their final data. */ - qemu_savevm_state_complete_precopy(ms->to_dst_file, true); + ret = qemu_savevm_state_complete_precopy_iterable(ms->to_dst_file, true); + if (ret) { + error_setg(errp, "Postcopy save non-postcopiable iterables failed"); + goto fail; + } /* * in Finish migrate and with the io-lock held everything should @@ -2732,7 +2736,12 @@ static int postcopy_start(MigrationState *ms, Error **errp) */ qemu_savevm_send_postcopy_listen(fb); - qemu_savevm_state_complete_precopy(fb, false); + ret = qemu_savevm_state_complete_precopy_non_iterable(fb, true); + if (ret) { + error_setg(errp, "Postcopy save non-iterable device states failed"); + goto fail_closefb; + } + if (migrate_postcopy_ram()) { qemu_savevm_send_ping(fb, 3); } diff --git a/migration/savevm.c b/migration/savevm.c index 9aef2fa..0ddc4c8 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -1477,7 +1477,6 @@ void qemu_savevm_state_complete_postcopy(QEMUFile *f) qemu_fflush(f); } -static int qemu_savevm_state_complete_precopy_iterable(QEMUFile *f, bool in_postcopy) { int64_t start_ts_each, end_ts_each; diff --git a/migration/savevm.h b/migration/savevm.h index c48a53e..7957460 100644 --- a/migration/savevm.h +++ b/migration/savevm.h @@ -44,6 +44,7 @@ void qemu_savevm_state_pending_exact(uint64_t *must_precopy, uint64_t *can_postcopy); void qemu_savevm_state_pending_estimate(uint64_t *must_precopy, uint64_t *can_postcopy); +int qemu_savevm_state_complete_precopy_iterable(QEMUFile *f, bool in_postcopy); void qemu_savevm_send_ping(QEMUFile *f, uint32_t value); void qemu_savevm_send_open_return_path(QEMUFile *f); int qemu_savevm_send_packaged(QEMUFile *f, const uint8_t *buf, size_t len); |