[Qemu-devel] [patch] avoid a bogus COMPLETED-CANCELLED transition
Avoid a bogus COMPLETED-CANCELLED transition. There is a period of time from the timing of setting COMPLETED state to that of migration thread exits, so during which it's problematic in COMPLETED-CANCELLED transition. Signed-off-by: Zeng Junliang zengjunli...@huawei.com Signed-off-by: Zhang Haoyu haoyu.zh...@huawei.com --- migration.c |9 - 1 files changed, 8 insertions(+), 1 deletions(-) diff --git a/migration.c b/migration.c index 2b1ab20..fd73b97 100644 --- a/migration.c +++ b/migration.c @@ -326,9 +326,16 @@ void migrate_fd_error(MigrationState *s) static void migrate_fd_cancel(MigrationState *s) { +int old_state ; DPRINTF(cancelling migration\n); -migrate_set_state(s, s-state, MIG_STATE_CANCELLED); +do { +old_state = s-state; +if (old_state != MIG_STATE_SETUP old_state != MIG_STATE_ACTIVE) { +break; +} +migrate_set_state(s, old_state, MIG_STATE_CANCELLED); +} while (s-state != MIG_STATE_CANCELLED); } void add_migration_state_change_notifier(Notifier *notify) -- 1.7.3.1.msysgit.0
Re: [Qemu-devel] [patch] avoid a bogus COMPLETED-CANCELLED transition
Il 07/11/2013 09:21, Zhanghaoyu (A) ha scritto: Avoid a bogus COMPLETED-CANCELLED transition. There is a period of time from the timing of setting COMPLETED state to that of migration thread exits, so during which it's problematic in COMPLETED-CANCELLED transition. Signed-off-by: Zeng Junliang zengjunli...@huawei.com Signed-off-by: Zhang Haoyu haoyu.zh...@huawei.com --- migration.c |9 - 1 files changed, 8 insertions(+), 1 deletions(-) diff --git a/migration.c b/migration.c index 2b1ab20..fd73b97 100644 --- a/migration.c +++ b/migration.c @@ -326,9 +326,16 @@ void migrate_fd_error(MigrationState *s) static void migrate_fd_cancel(MigrationState *s) { +int old_state ; DPRINTF(cancelling migration\n); -migrate_set_state(s, s-state, MIG_STATE_CANCELLED); +do { +old_state = s-state; +if (old_state != MIG_STATE_SETUP old_state != MIG_STATE_ACTIVE) { +break; +} +migrate_set_state(s, old_state, MIG_STATE_CANCELLED); +} while (s-state != MIG_STATE_CANCELLED); } void add_migration_state_change_notifier(Notifier *notify) Reviewed-by: Paolo Bonzini pbonz...@redhat.com