From: Peter Xu Date: Tue, 27 Jan 2026 18:52:52 +0000 (-0500) Subject: migration: Make qemu_savevm_state_non_iterable() take errp X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6b56e62de313b226b2fbeba055ed48cc7581be3a;p=thirdparty%2Fqemu.git migration: Make qemu_savevm_state_non_iterable() take errp Let the function report errors to upper layers. Out of three current users, two of them already process the errors, except one outlier, qemu_savevm_state_complete_precopy(), where we do it manually for now with a comment for TODO. Signed-off-by: Peter Xu Tested-by: Lukas Straub Link: https://lore.kernel.org/qemu-devel/20260127185254.3954634-23-peterx@redhat.com [add space in error_prepend string] Signed-off-by: Fabiano Rosas --- diff --git a/migration/migration.c b/migration/migration.c index f9eec4b25a..a5b0465ed3 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -2552,9 +2552,9 @@ static int postcopy_start(MigrationState *ms, Error **errp) */ qemu_savevm_send_postcopy_listen(fb); - ret = qemu_savevm_state_non_iterable(fb); + ret = qemu_savevm_state_non_iterable(fb, errp); if (ret) { - error_setg(errp, "Postcopy save non-iterable device states failed"); + error_prepend(errp, "Postcopy save non-iterable states failed: "); goto fail_closefb; } @@ -3687,8 +3687,8 @@ static void *bg_migration_thread(void *opaque) goto fail_with_bql; } - if (qemu_savevm_state_non_iterable(fb)) { - error_setg(&local_err, "Failed to save non-iterable devices"); + if (qemu_savevm_state_non_iterable(fb, &local_err)) { + error_prepend(&local_err, "Failed to save non-iterable devices "); goto fail_with_bql; } diff --git a/migration/savevm.c b/migration/savevm.c index c16951b532..130b9764a7 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -1710,13 +1710,12 @@ void qemu_savevm_state_end_precopy(MigrationState *s, QEMUFile *f) qemu_savevm_state_vm_desc(s, f); } -int qemu_savevm_state_non_iterable(QEMUFile *f) +int qemu_savevm_state_non_iterable(QEMUFile *f, Error **errp) { MigrationState *ms = migrate_get_current(); int64_t start_ts_each, end_ts_each; JSONWriter *vmdesc = ms->vmdesc; SaveStateEntry *se; - Error *local_err = NULL; int ret; /* Making sure cpu states are synchronized before saving non-iterable */ @@ -1730,10 +1729,8 @@ int qemu_savevm_state_non_iterable(QEMUFile *f) start_ts_each = qemu_clock_get_us(QEMU_CLOCK_REALTIME); - ret = vmstate_save(f, se, vmdesc, &local_err); + ret = vmstate_save(f, se, vmdesc, errp); if (ret) { - migrate_error_propagate(ms, error_copy(local_err)); - error_report_err(local_err); return ret; } @@ -1750,6 +1747,7 @@ int qemu_savevm_state_non_iterable(QEMUFile *f) int qemu_savevm_state_complete_precopy(MigrationState *s) { QEMUFile *f = s->to_dst_file; + Error *local_err = NULL; int ret; ret = qemu_savevm_state_complete_precopy_iterable(f, false); @@ -1757,8 +1755,11 @@ int qemu_savevm_state_complete_precopy(MigrationState *s) return ret; } - ret = qemu_savevm_state_non_iterable(f); + /* TODO: pass error upper */ + ret = qemu_savevm_state_non_iterable(f, &local_err); if (ret) { + migrate_error_propagate(s, error_copy(local_err)); + error_report_err(local_err); return ret; } diff --git a/migration/savevm.h b/migration/savevm.h index f2750eca09..6a589b2990 100644 --- a/migration/savevm.h +++ b/migration/savevm.h @@ -74,7 +74,7 @@ int qemu_loadvm_state_main(QEMUFile *f, MigrationIncomingState *mis, Error **errp); int qemu_load_device_state(QEMUFile *f, Error **errp); int qemu_loadvm_approve_switchover(void); -int qemu_savevm_state_non_iterable(QEMUFile *f); +int qemu_savevm_state_non_iterable(QEMUFile *f, Error **errp); int qemu_savevm_state_non_iterable_early(QEMUFile *f, JSONWriter *vmdesc, Error **errp);