[Qemu-devel] [patch] avoid a bogus COMPLETED-CANCELLED transition

2013-11-07 Thread Zhanghaoyu (A)
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

2013-11-07 Thread Paolo Bonzini
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