}
bql_lock();
- ret = qemu_savevm_state_setup(s->to_dst_file, &local_err);
+ ret = qemu_savevm_state_do_setup(s->to_dst_file, &local_err);
bql_unlock();
qemu_savevm_wait_unplug(s, MIGRATION_STATUS_SETUP,
bql_lock();
qemu_savevm_state_header(s->to_dst_file);
- ret = qemu_savevm_state_setup(s->to_dst_file, &local_err);
+ ret = qemu_savevm_state_do_setup(s->to_dst_file, &local_err);
bql_unlock();
qemu_savevm_wait_unplug(s, MIGRATION_STATUS_SETUP,
return 0;
}
-int qemu_savevm_state_setup(QEMUFile *f, Error **errp)
+int qemu_savevm_state_non_iterable_early(QEMUFile *f,
+ JSONWriter *vmdesc,
+ Error **errp)
{
- ERRP_GUARD();
- MigrationState *ms = migrate_get_current();
- JSONWriter *vmdesc = ms->vmdesc;
SaveStateEntry *se;
- int ret = 0;
-
- if (vmdesc) {
- json_writer_int64(vmdesc, "page_size", qemu_target_page_size());
- json_writer_start_array(vmdesc, "devices");
- }
+ int ret;
- trace_savevm_state_setup();
QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
if (se->vmsd && se->vmsd->early_setup) {
ret = vmstate_save(f, se, vmdesc, errp);
if (ret) {
- break;
+ return ret;
}
- continue;
}
+ }
+
+ return 0;
+}
+
+static int qemu_savevm_state_setup(QEMUFile *f, Error **errp)
+{
+ SaveStateEntry *se;
+ int ret;
+
+ trace_savevm_state_setup();
+ QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
if (!se->ops || !se->ops->save_setup) {
continue;
}
}
}
save_section_header(f, se, QEMU_VM_SECTION_START);
-
ret = se->ops->save_setup(f, se->opaque, errp);
save_section_footer(f, se);
if (ret < 0) {
- break;
+ return ret;
}
}
+ return 0;
+}
+
+int qemu_savevm_state_do_setup(QEMUFile *f, Error **errp)
+{
+ ERRP_GUARD();
+ MigrationState *ms = migrate_get_current();
+ JSONWriter *vmdesc = ms->vmdesc;
+ int ret;
+
+ if (vmdesc) {
+ json_writer_int64(vmdesc, "page_size", qemu_target_page_size());
+ json_writer_start_array(vmdesc, "devices");
+ }
+
+ ret = qemu_savevm_state_non_iterable_early(f, vmdesc, errp);
+ if (ret) {
+ return ret;
+ }
+
+ ret = qemu_savevm_state_setup(f, errp);
if (ret) {
return ret;
}
ms->to_dst_file = f;
qemu_savevm_state_header(f);
- ret = qemu_savevm_state_setup(f, errp);
+ ret = qemu_savevm_state_do_setup(f, errp);
if (ret) {
goto cleanup;
}
bool qemu_savevm_state_blocked(Error **errp);
void qemu_savevm_non_migratable_list(strList **reasons);
int qemu_savevm_state_prepare(Error **errp);
-int qemu_savevm_state_setup(QEMUFile *f, Error **errp);
+int qemu_savevm_state_do_setup(QEMUFile *f, Error **errp);
bool qemu_savevm_state_guest_unplug_pending(void);
int qemu_savevm_state_resume_prepare(MigrationState *s);
void qemu_savevm_send_header(QEMUFile *f);
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_early(QEMUFile *f,
+ JSONWriter *vmdesc,
+ Error **errp);
bool qemu_loadvm_load_state_buffer(const char *idstr, uint32_t instance_id,
char *buf, size_t len, Error **errp);