mirror of https://github.com/xemu-project/xemu.git
migration: Recover behavior of preempt channel creation for pre-7.2
In 8.0 devel window we reworked preempt channel creation, so that there'll be no race condition when the migration channel and preempt channel got established in the wrong order in commit5655aab079
. However no one noticed that the change will also be not compatible with older qemus, majorly 7.1/7.2 versions where preempt mode started to be supported. Leverage the same pre-7.2 flag introduced in the previous patch to recover the behavior hopefully before 8.0 releases, so we don't break migration when we migrate from 8.0 to older qemu binaries. Fixes:5655aab079
("migration: Postpone postcopy preempt channel to be after main") Signed-off-by: Peter Xu <peterx@redhat.com> Reviewed-by: Juan Quintela <quintela@redhat.com> Signed-off-by: Juan Quintela <quintela@redhat.com>
This commit is contained in:
parent
6621883f93
commit
06064a6715
|
@ -4388,6 +4388,15 @@ void migrate_fd_connect(MigrationState *s, Error *error_in)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This needs to be done before resuming a postcopy. Note: for newer
|
||||||
|
* QEMUs we will delay the channel creation until postcopy_start(), to
|
||||||
|
* avoid disorder of channel creations.
|
||||||
|
*/
|
||||||
|
if (migrate_postcopy_preempt() && s->preempt_pre_7_2) {
|
||||||
|
postcopy_preempt_setup(s);
|
||||||
|
}
|
||||||
|
|
||||||
if (resume) {
|
if (resume) {
|
||||||
/* Wakeup the main migration thread to do the recovery */
|
/* Wakeup the main migration thread to do the recovery */
|
||||||
migrate_set_state(&s->state, MIGRATION_STATUS_POSTCOPY_PAUSED,
|
migrate_set_state(&s->state, MIGRATION_STATUS_POSTCOPY_PAUSED,
|
||||||
|
|
|
@ -384,12 +384,19 @@ struct MigrationState {
|
||||||
* - postcopy preempt src QEMU instance will generate an EOS message at
|
* - postcopy preempt src QEMU instance will generate an EOS message at
|
||||||
* the end of migration to shut the preempt channel on dest side.
|
* the end of migration to shut the preempt channel on dest side.
|
||||||
*
|
*
|
||||||
|
* - postcopy preempt channel will be created at the setup phase on src
|
||||||
|
QEMU.
|
||||||
|
*
|
||||||
* When clear:
|
* When clear:
|
||||||
*
|
*
|
||||||
* - postcopy preempt src QEMU instance will _not_ generate an EOS
|
* - postcopy preempt src QEMU instance will _not_ generate an EOS
|
||||||
* message at the end of migration, the dest qemu will shutdown the
|
* message at the end of migration, the dest qemu will shutdown the
|
||||||
* channel itself.
|
* channel itself.
|
||||||
*
|
*
|
||||||
|
* - postcopy preempt channel will be created at the switching phase
|
||||||
|
* from precopy -> postcopy (to avoid race condtion of misordered
|
||||||
|
* creation of channels).
|
||||||
|
*
|
||||||
* NOTE: See message-id <ZBoShWArKDPpX/D7@work-vm> on qemu-devel
|
* NOTE: See message-id <ZBoShWArKDPpX/D7@work-vm> on qemu-devel
|
||||||
* mailing list for more information on the possible race. Everyone
|
* mailing list for more information on the possible race. Everyone
|
||||||
* should probably just keep this value untouched after set by the
|
* should probably just keep this value untouched after set by the
|
||||||
|
|
|
@ -1630,8 +1630,14 @@ int postcopy_preempt_establish_channel(MigrationState *s)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Kick off async task to establish preempt channel */
|
/*
|
||||||
postcopy_preempt_setup(s);
|
* Kick off async task to establish preempt channel. Only do so with
|
||||||
|
* 8.0+ machines, because 7.1/7.2 require the channel to be created in
|
||||||
|
* setup phase of migration (even if racy in an unreliable network).
|
||||||
|
*/
|
||||||
|
if (!s->preempt_pre_7_2) {
|
||||||
|
postcopy_preempt_setup(s);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We need the postcopy preempt channel to be established before
|
* We need the postcopy preempt channel to be established before
|
||||||
|
|
Loading…
Reference in New Issue