From: Peter Xu Date: Tue, 27 Jan 2026 18:52:45 +0000 (-0500) Subject: migration: Provide helper for save vm description X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=56294bcd25572c47fdfc43504f1d9e7640a59a05;p=thirdparty%2Fqemu.git migration: Provide helper for save vm description Provide two smaller helpers to dump the vm desc. Preparing to move it out and generalize device state dump. Signed-off-by: Peter Xu Reviewed-by: Fabiano Rosas Tested-by: Lukas Straub Link: https://lore.kernel.org/qemu-devel/20260127185254.3954634-16-peterx@redhat.com Signed-off-by: Fabiano Rosas --- diff --git a/migration/savevm.c b/migration/savevm.c index a787691352..41560b97a4 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -1669,13 +1669,34 @@ ret_fail_abort_threads: return -1; } +static void qemu_savevm_state_vm_desc(MigrationState *s, QEMUFile *f) +{ + JSONWriter *vmdesc = s->vmdesc; + int vmdesc_len; + + if (vmdesc) { + json_writer_end_array(vmdesc); + json_writer_end_object(vmdesc); + vmdesc_len = strlen(json_writer_get(vmdesc)); + + qemu_put_byte(f, QEMU_VM_VMDESCRIPTION); + qemu_put_be32(f, vmdesc_len); + qemu_put_buffer(f, (uint8_t *)json_writer_get(vmdesc), vmdesc_len); + } +} + +void qemu_savevm_state_end_precopy(MigrationState *s, QEMUFile *f) +{ + qemu_savevm_state_end(f); + qemu_savevm_state_vm_desc(s, f); +} + int qemu_savevm_state_complete_precopy_non_iterable(QEMUFile *f, bool in_postcopy) { MigrationState *ms = migrate_get_current(); int64_t start_ts_each, end_ts_each; JSONWriter *vmdesc = ms->vmdesc; - int vmdesc_len; SaveStateEntry *se; Error *local_err = NULL; int ret; @@ -1705,17 +1726,7 @@ int qemu_savevm_state_complete_precopy_non_iterable(QEMUFile *f, if (!in_postcopy) { /* Postcopy stream will still be going */ - qemu_savevm_state_end(f); - - if (vmdesc) { - json_writer_end_array(vmdesc); - json_writer_end_object(vmdesc); - vmdesc_len = strlen(json_writer_get(vmdesc)); - - qemu_put_byte(f, QEMU_VM_VMDESCRIPTION); - qemu_put_be32(f, vmdesc_len); - qemu_put_buffer(f, (uint8_t *)json_writer_get(vmdesc), vmdesc_len); - } + qemu_savevm_state_end_precopy(ms, f); } trace_vmstate_downtime_checkpoint("src-non-iterable-saved"); diff --git a/migration/savevm.h b/migration/savevm.h index d0596d1d62..f957f851ef 100644 --- a/migration/savevm.h +++ b/migration/savevm.h @@ -50,6 +50,7 @@ void qemu_savevm_state_pending_estimate(uint64_t *must_precopy, int qemu_savevm_state_complete_precopy_iterable(QEMUFile *f, bool in_postcopy); bool qemu_savevm_state_postcopy_prepare(QEMUFile *f, Error **errp); void qemu_savevm_state_end(QEMUFile *f); +void qemu_savevm_state_end_precopy(MigrationState *s, QEMUFile *f); 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);