From 3c4f6f0c2bf5562f2aa26f964848ae53e6ac4790 Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Tue, 3 Mar 2020 14:51:43 +0000 Subject: [PATCH 11/18] migration: Maybe VM is paused when migration is cancelled RH-Author: Juan Quintela Message-id: <20200303145143.149290-11-quintela@redhat.com> Patchwork-id: 94120 O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH v2 10/10] migration: Maybe VM is paused when migration is cancelled Bugzilla: 1738451 RH-Acked-by: Laurent Vivier RH-Acked-by: Peter Xu RH-Acked-by: Dr. David Alan Gilbert From: Zhimin Feng If the migration is cancelled when it is in the completion phase, the migration state is set to MIGRATION_STATUS_CANCELLING. The VM maybe wait for the 'pause_sem' semaphore in migration_maybe_pause function, so that VM always is paused. Reported-by: Euler Robot Signed-off-by: Zhimin Feng Reviewed-by: Juan Quintela Signed-off-by: Juan Quintela (cherry picked from commit 8958338b10abcb346b54a8038a491fda2db1c853) Signed-off-by: Danilo C. L. de Paula --- migration/migration.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/migration/migration.c b/migration/migration.c index eb50d77..ed18c59 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -2786,14 +2786,22 @@ static int migration_maybe_pause(MigrationState *s, /* This block intentionally left blank */ } - qemu_mutex_unlock_iothread(); - migrate_set_state(&s->state, *current_active_state, - MIGRATION_STATUS_PRE_SWITCHOVER); - qemu_sem_wait(&s->pause_sem); - migrate_set_state(&s->state, MIGRATION_STATUS_PRE_SWITCHOVER, - new_state); - *current_active_state = new_state; - qemu_mutex_lock_iothread(); + /* + * If the migration is cancelled when it is in the completion phase, + * the migration state is set to MIGRATION_STATUS_CANCELLING. + * So we don't need to wait a semaphore, otherwise we would always + * wait for the 'pause_sem' semaphore. + */ + if (s->state != MIGRATION_STATUS_CANCELLING) { + qemu_mutex_unlock_iothread(); + migrate_set_state(&s->state, *current_active_state, + MIGRATION_STATUS_PRE_SWITCHOVER); + qemu_sem_wait(&s->pause_sem); + migrate_set_state(&s->state, MIGRATION_STATUS_PRE_SWITCHOVER, + new_state); + *current_active_state = new_state; + qemu_mutex_lock_iothread(); + } return s->state == new_state ? 0 : -EINVAL; } -- 1.8.3.1