Browse Source

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 <peterx@redhat.com>
Tested-by: Lukas Straub <lukasstraub2@web.de>
Link: https://lore.kernel.org/qemu-devel/20260127185254.3954634-23-peterx@redhat.com
[add space in error_prepend string]
Signed-off-by: Fabiano Rosas <farosas@suse.de>
master
Peter Xu 2 months ago
committed by Fabiano Rosas
parent
commit
6b56e62de3
  1. 8
      migration/migration.c
  2. 13
      migration/savevm.c
  3. 2
      migration/savevm.h

8
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;
}

13
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;
}

2
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);

Loading…
Cancel
Save