From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55553) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VoajW-0001q3-Jr for qemu-devel@nongnu.org; Thu, 05 Dec 2013 10:21:00 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VoajR-00060d-4X for qemu-devel@nongnu.org; Thu, 05 Dec 2013 10:20:54 -0500 Received: from mail-qa0-x230.google.com ([2607:f8b0:400d:c00::230]:39830) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VoajQ-00060W-Ko for qemu-devel@nongnu.org; Thu, 05 Dec 2013 10:20:48 -0500 Received: by mail-qa0-f48.google.com with SMTP id w5so7792027qac.14 for ; Thu, 05 Dec 2013 07:20:47 -0800 (PST) Sender: Paolo Bonzini Message-ID: <52A099C9.5050504@redhat.com> Date: Thu, 05 Dec 2013 16:20:41 +0100 From: Paolo Bonzini MIME-Version: 1.0 References: <527B77B7.6010107@redhat.com> In-Reply-To: <527B77B7.6010107@redhat.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] PING Re: [patch] introduce MIG_STATE_CANCELLING state List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Juan Quintela Cc: "Huangweidong (C)" , Gleb Natapov , "Michael S. Tsirkin" , "Zhanghaoyu (A)" , Marcelo Tosatti , Luonengjun , "qemu-devel@nongnu.org" , Zengjunliang , "Wangrui (K)" Il 07/11/2013 12:21, Paolo Bonzini ha scritto: > 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 >> Signed-off-by: Zhang Haoyu >> --- >> 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 Ping. Juan? Paolo