Re: [Qemu-devel] [patch] introduce MIG_STATE_CANCELLING state
Reviewed-by: Wenchao Xia xiaw...@linux.vnet.ibm.com
[Qemu-devel] [patch] introduce MIG_STATE_CANCELLING state
Introduce MIG_STATE_CANCELLING state to avoid starting a new migration task while the previous one still exist. Signed-off-by: Zeng Junliang zengjunli...@huawei.com Signed-off-by: Zhang Haoyu haoyu.zh...@huawei.com --- migration.c | 26 -- 1 files changed, 16 insertions(+), 10 deletions(-) diff --git a/migration.c b/migration.c index fd73b97..af8a09c 100644 --- a/migration.c +++ b/migration.c @@ -40,6 +40,7 @@ enum { MIG_STATE_ERROR = -1, MIG_STATE_NONE, MIG_STATE_SETUP, +MIG_STATE_CANCELLING, MIG_STATE_CANCELLED, MIG_STATE_ACTIVE, MIG_STATE_COMPLETED, @@ -196,6 +197,7 @@ MigrationInfo *qmp_query_migrate(Error **errp) info-has_total_time = false; break; case MIG_STATE_ACTIVE: +case MIG_STATE_CANCELLING: info-has_status = true; info-status = g_strdup(active); info-has_total_time = true; @@ -282,6 +284,13 @@ void qmp_migrate_set_capabilities(MigrationCapabilityStatusList *params, /* shared migration helpers */ +static void migrate_set_state(MigrationState *s, int old_state, int new_state) +{ +if (atomic_cmpxchg(s-state, old_state, new_state) == new_state) { +trace_migrate_set_state(new_state); +} +} + static void migrate_fd_cleanup(void *opaque) { MigrationState *s = opaque; @@ -303,18 +312,14 @@ static void migrate_fd_cleanup(void *opaque) if (s-state != MIG_STATE_COMPLETED) { qemu_savevm_state_cancel(); +if (s-state == MIG_STATE_CANCELLING) { +migrate_set_state(s, MIG_STATE_CANCELLING, MIG_STATE_CANCELLED); +} } notifier_list_notify(migration_state_notifiers, s); } -static void migrate_set_state(MigrationState *s, int old_state, int new_state) -{ -if (atomic_cmpxchg(s-state, old_state, new_state) == new_state) { -trace_migrate_set_state(new_state); -} -} - void migrate_fd_error(MigrationState *s) { DPRINTF(setting error state\n); @@ -334,8 +339,8 @@ static void migrate_fd_cancel(MigrationState *s) 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); +migrate_set_state(s, old_state, MIG_STATE_CANCELLING); +} while (s-state != MIG_STATE_CANCELLING); } void add_migration_state_change_notifier(Notifier *notify) @@ -412,7 +417,8 @@ void qmp_migrate(const char *uri, bool has_blk, bool blk, params.blk = has_blk blk; params.shared = has_inc inc; -if (s-state == MIG_STATE_ACTIVE || s-state == MIG_STATE_SETUP) { +if (s-state == MIG_STATE_ACTIVE || s-state == MIG_STATE_SETUP || +s-state == MIG_STATE_CANCELLING) { error_set(errp, QERR_MIGRATION_ACTIVE); return; } -- 1.7.3.1.msysgit.0
Re: [Qemu-devel] [patch] introduce MIG_STATE_CANCELLING state
Il 07/11/2013 12:01, Zhanghaoyu (A) ha scritto: Introduce MIG_STATE_CANCELLING state to avoid starting a new migration task while the previous one still exist. Signed-off-by: Zeng Junliang zengjunli...@huawei.com Signed-off-by: Zhang Haoyu haoyu.zh...@huawei.com --- migration.c | 26 -- 1 files changed, 16 insertions(+), 10 deletions(-) diff --git a/migration.c b/migration.c index fd73b97..af8a09c 100644 --- a/migration.c +++ b/migration.c @@ -40,6 +40,7 @@ enum { MIG_STATE_ERROR = -1, MIG_STATE_NONE, MIG_STATE_SETUP, +MIG_STATE_CANCELLING, MIG_STATE_CANCELLED, MIG_STATE_ACTIVE, MIG_STATE_COMPLETED, @@ -196,6 +197,7 @@ MigrationInfo *qmp_query_migrate(Error **errp) info-has_total_time = false; break; case MIG_STATE_ACTIVE: +case MIG_STATE_CANCELLING: info-has_status = true; info-status = g_strdup(active); info-has_total_time = true; @@ -282,6 +284,13 @@ void qmp_migrate_set_capabilities(MigrationCapabilityStatusList *params, /* shared migration helpers */ +static void migrate_set_state(MigrationState *s, int old_state, int new_state) +{ +if (atomic_cmpxchg(s-state, old_state, new_state) == new_state) { +trace_migrate_set_state(new_state); +} +} + static void migrate_fd_cleanup(void *opaque) { MigrationState *s = opaque; @@ -303,18 +312,14 @@ static void migrate_fd_cleanup(void *opaque) if (s-state != MIG_STATE_COMPLETED) { qemu_savevm_state_cancel(); +if (s-state == MIG_STATE_CANCELLING) { +migrate_set_state(s, MIG_STATE_CANCELLING, MIG_STATE_CANCELLED); +} } notifier_list_notify(migration_state_notifiers, s); } -static void migrate_set_state(MigrationState *s, int old_state, int new_state) -{ -if (atomic_cmpxchg(s-state, old_state, new_state) == new_state) { -trace_migrate_set_state(new_state); -} -} - void migrate_fd_error(MigrationState *s) { DPRINTF(setting error state\n); @@ -334,8 +339,8 @@ static void migrate_fd_cancel(MigrationState *s) 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); +migrate_set_state(s, old_state, MIG_STATE_CANCELLING); +} while (s-state != MIG_STATE_CANCELLING); } void add_migration_state_change_notifier(Notifier *notify) @@ -412,7 +417,8 @@ void qmp_migrate(const char *uri, bool has_blk, bool blk, params.blk = has_blk blk; params.shared = has_inc inc; -if (s-state == MIG_STATE_ACTIVE || s-state == MIG_STATE_SETUP) { +if (s-state == MIG_STATE_ACTIVE || s-state == MIG_STATE_SETUP || +s-state == MIG_STATE_CANCELLING) { error_set(errp, QERR_MIGRATION_ACTIVE); return; } Reviewed-by: Paolo Bonzini pbonz...@redhat.com