Don't iterate on precopy-only devices during postcopy

During the postcopy phase we must not call the iterate method on
precopy-only devices, since they may have done some cleanup during
the _complete call at the end of the precopy phase.

Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
Signed-off-by: Juan Quintela <quintela@redhat.com>
This commit is contained in:
Dr. David Alan Gilbert 2015-11-05 18:11:14 +00:00 committed by Juan Quintela
parent 663e6c1df8
commit 35ecd943e7
3 changed files with 13 additions and 4 deletions

View File

@ -109,7 +109,7 @@ bool qemu_savevm_state_blocked(Error **errp);
void qemu_savevm_state_begin(QEMUFile *f, void qemu_savevm_state_begin(QEMUFile *f,
const MigrationParams *params); const MigrationParams *params);
void qemu_savevm_state_header(QEMUFile *f); void qemu_savevm_state_header(QEMUFile *f);
int qemu_savevm_state_iterate(QEMUFile *f); int qemu_savevm_state_iterate(QEMUFile *f, bool postcopy);
void qemu_savevm_state_cleanup(void); void qemu_savevm_state_cleanup(void);
void qemu_savevm_state_complete_postcopy(QEMUFile *f); void qemu_savevm_state_complete_postcopy(QEMUFile *f);
void qemu_savevm_state_complete_precopy(QEMUFile *f); void qemu_savevm_state_complete_precopy(QEMUFile *f);

View File

@ -1628,7 +1628,7 @@ static void *migration_thread(void *opaque)
continue; continue;
} }
/* Just another iteration step */ /* Just another iteration step */
qemu_savevm_state_iterate(s->file); qemu_savevm_state_iterate(s->file, entered_postcopy);
} else { } else {
trace_migration_thread_low_pending(pending_size); trace_migration_thread_low_pending(pending_size);
migration_completion(s, current_active_state, migration_completion(s, current_active_state,

View File

@ -931,7 +931,7 @@ void qemu_savevm_state_begin(QEMUFile *f,
* 0 : We haven't finished, caller have to go again * 0 : We haven't finished, caller have to go again
* 1 : We have finished, we can go to complete phase * 1 : We have finished, we can go to complete phase
*/ */
int qemu_savevm_state_iterate(QEMUFile *f) int qemu_savevm_state_iterate(QEMUFile *f, bool postcopy)
{ {
SaveStateEntry *se; SaveStateEntry *se;
int ret = 1; int ret = 1;
@ -946,6 +946,15 @@ int qemu_savevm_state_iterate(QEMUFile *f)
continue; continue;
} }
} }
/*
* In the postcopy phase, any device that doesn't know how to
* do postcopy should have saved it's state in the _complete
* call that's already run, it might get confused if we call
* iterate afterwards.
*/
if (postcopy && !se->ops->save_live_complete_postcopy) {
continue;
}
if (qemu_file_rate_limit(f)) { if (qemu_file_rate_limit(f)) {
return 0; return 0;
} }
@ -1160,7 +1169,7 @@ static int qemu_savevm_state(QEMUFile *f, Error **errp)
qemu_mutex_lock_iothread(); qemu_mutex_lock_iothread();
while (qemu_file_get_error(f) == 0) { while (qemu_file_get_error(f) == 0) {
if (qemu_savevm_state_iterate(f) > 0) { if (qemu_savevm_state_iterate(f, false) > 0) {
break; break;
} }
} }