Laurent Vivier <lviv...@redhat.com> wrote: > If the user cancels the migration in the unplug-wait state, > QEMU will try to plug back the card and this fails because the card > is partially unplugged. > To avoid the problem, continue to wait the card unplug, but to > allow the migration to be canceled if the card never finishes to unplug > use a timeout. > > Bug: https://bugzilla.redhat.com/show_bug.cgi?id=1976852 > Signed-off-by: Laurent Vivier <lviv...@redhat.com> > --- > migration/migration.c | 11 +++++++++++ > 1 file changed, 11 insertions(+) > > diff --git a/migration/migration.c b/migration/migration.c > index 3e92c405a2b6..3b06d43a7f42 100644 > --- a/migration/migration.c > +++ b/migration/migration.c > @@ -3679,6 +3679,17 @@ static void qemu_savevm_wait_unplug(MigrationState *s, > int old_state, > qemu_savevm_state_guest_unplug_pending()) { > qemu_sem_timedwait(&s->wait_unplug_sem, 250); > } > + if (s->state != MIGRATION_STATUS_WAIT_UNPLUG) { > + int timeout = 120; /* 30 seconds */ > + /* > + * migration has been canceled > + * but as we have started an unplug we must wait the end > + * to be able to plug back the card > + */ > + while (timeout-- && qemu_savevm_state_guest_unplug_pending()) { > + qemu_sem_timedwait(&s->wait_unplug_sem, 250); > + } > + } > > migrate_set_state(&s->state, MIGRATION_STATUS_WAIT_UNPLUG, > new_state); > } else {
I agree with the idea. But if we are getting out due to timeout == 0, shouldn't we return some error, warning, whatever? Later, Juan.