From patchwork Thu Nov 7 11:01:15 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Zhanghaoyu (A)" X-Patchwork-Id: 289292 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id DFD5B2C00CE for ; Thu, 7 Nov 2013 22:04:05 +1100 (EST) Received: from localhost ([::1]:39599 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VeNNa-0005sc-T9 for incoming@patchwork.ozlabs.org; Thu, 07 Nov 2013 06:04:02 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50973) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VeNNF-0005qG-IV for qemu-devel@nongnu.org; Thu, 07 Nov 2013 06:03:46 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VeNNA-00068O-Q8 for qemu-devel@nongnu.org; Thu, 07 Nov 2013 06:03:41 -0500 Received: from szxga03-in.huawei.com ([119.145.14.66]:62852) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VeNNA-00068D-5g for qemu-devel@nongnu.org; Thu, 07 Nov 2013 06:03:36 -0500 Received: from 172.24.2.119 (EHLO szxeml205-edg.china.huawei.com) ([172.24.2.119]) by szxrg03-dlp.huawei.com (MOS 4.4.3-GA FastPath queued) with ESMTP id AGH77670; Thu, 07 Nov 2013 19:03:27 +0800 (CST) Received: from SZXEML456-HUB.china.huawei.com (10.82.67.199) by szxeml205-edg.china.huawei.com (172.24.2.58) with Microsoft SMTP Server (TLS) id 14.3.158.1; Thu, 7 Nov 2013 19:01:23 +0800 Received: from szxeml556-mbx.china.huawei.com ([169.254.3.69]) by szxeml456-hub.china.huawei.com ([10.82.67.199]) with mapi id 14.03.0158.001; Thu, 7 Nov 2013 19:01:16 +0800 From: "Zhanghaoyu (A)" To: "qemu-devel@nongnu.org" , Paolo Bonzini , "Michael S. Tsirkin" , Marcelo Tosatti , Eric Blake , Gleb Natapov Thread-Topic: [patch] introduce MIG_STATE_CANCELLING state Thread-Index: Ac7bqKYU/R3T1zBQTvmBulB7NLavyw== Date: Thu, 7 Nov 2013 11:01:15 +0000 Message-ID: Accept-Language: zh-CN, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-cr-hashedpuzzle: FJDQ Fm2c R/JS VNY9 XO3T cGzS gsLl vuKl zzok 1DKI 47+b 53i4 6qnD 982p AANmCQ== AAvqjw==; 6; ZQBiAGwAYQBrAGUAQAByAGUAZABoAGEAdAAuAGMAbwBtADsAZwBsAGUAYgBAAHIAZQBkAGgAYQB0AC4AYwBvAG0AOwBtAHMAdABAAHIAZQBkAGgAYQB0AC4AYwBvAG0AOwBtAHQAbwBzAGEAdAB0AGkAQAByAGUAZABoAGEAdAAuAGMAbwBtADsAcABiAG8AbgB6AGkAbgBpAEAAcgBlAGQAaABhAHQALgBjAG8AbQA7AHEAZQBtAHUALQBkAGUAdgBlAGwAQABuAG8AbgBnAG4AdQAuAG8AcgBnAA==; Sosha1_v1; 7; {DCA954F9-9598-4051-8163-21F1FF66CA21}; aABhAG8AeQB1AC4AegBoAGEAbgBnAEAAaAB1AGEAdwBlAGkALgBjAG8AbQA=; Thu, 07 Nov 2013 11:01:02 GMT; WwBwAGEAdABjAGgAXQAgAGkAbgB0AHIAbwBkAHUAYwBlACAATQBJAEcAXwBTAFQAQQBUAEUAXwBDAEEATgBDAEUATABMAEkATgBHACAAcwB0AGEAdABlAA== x-cr-puzzleid: {DCA954F9-9598-4051-8163-21F1FF66CA21} x-originating-ip: [10.135.68.97] MIME-Version: 1.0 X-CFilter-Loop: Reflected X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4.x-2.6.x [generic] X-Received-From: 119.145.14.66 Cc: "Huangweidong \(C\)" , Luonengjun , Zengjunliang , "Wangrui \(K\)" Subject: [Qemu-devel] [patch] introduce MIG_STATE_CANCELLING state X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org 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 Reviewed-by: Paolo Bonzini Reviewed-by: Wenchao Xia --- 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; }