From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48082) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Yb0R1-0002ox-Ig for qemu-devel@nongnu.org; Thu, 26 Mar 2015 01:34:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Yb0R0-0007ev-Nt for qemu-devel@nongnu.org; Thu, 26 Mar 2015 01:34:27 -0400 Received: from szxga03-in.huawei.com ([119.145.14.66]:47838) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Yb0Qz-0007co-53 for qemu-devel@nongnu.org; Thu, 26 Mar 2015 01:34:26 -0400 From: zhanghailiang Date: Thu, 26 Mar 2015 13:29:22 +0800 Message-ID: <1427347774-8960-17-git-send-email-zhang.zhanghailiang@huawei.com> In-Reply-To: <1427347774-8960-1-git-send-email-zhang.zhanghailiang@huawei.com> References: <1427347774-8960-1-git-send-email-zhang.zhanghailiang@huawei.com> MIME-Version: 1.0 Content-Type: text/plain Subject: [Qemu-devel] [RFC PATCH v4 16/28] COLO failover: Don't do failover during loading VM's state List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: lizhijian@cn.fujitsu.com, quintela@redhat.com, yunhong.jiang@intel.com, eddie.dong@intel.com, peter.huangpeng@huawei.com, dgilbert@redhat.com, zhanghailiang , arei.gonglei@huawei.com, amit.shah@redhat.com, Lai Jiangshan , david@gibson.dropbear.id.au Signed-off-by: zhanghailiang Signed-off-by: Li Zhijian Signed-off-by: Lai Jiangshan --- migration/colo.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/migration/colo.c b/migration/colo.c index 6240178..f419e88 100644 --- a/migration/colo.c +++ b/migration/colo.c @@ -60,6 +60,7 @@ enum { }; static QEMUBH *colo_bh; +static bool vmstate_loading; static Coroutine *colo; /* colo buffer */ #define COLO_BUFFER_BASE_SIZE (1000*1000*4ULL) @@ -91,7 +92,10 @@ static bool colo_runstate_is_stopped(void) */ static void slave_do_failover(void) { - DPRINTF("do_failover!\n"); + /* Wait for incoming thread loading vmstate */ + while (vmstate_loading) { + ; + } colo = NULL; @@ -125,6 +129,7 @@ static void master_do_failover(void) static bool failover_completed; void colo_do_failover(MigrationState *s) { + DPRINTF("do_failover!\n"); /* Make sure vm stopped while failover */ if (!colo_runstate_is_stopped()) { vm_stop_force_state(RUN_STATE_COLO); @@ -497,12 +502,15 @@ void *colo_process_incoming_checkpoints(void *opaque) } qemu_mutex_lock_iothread(); + vmstate_loading = true; if (qemu_loadvm_state(fb) < 0) { error_report("COLO: loadvm failed"); + vmstate_loading = false; qemu_mutex_unlock_iothread(); goto out; } DPRINTF("Finish load all vm state to cache\n"); + vmstate_loading = false; qemu_mutex_unlock_iothread(); ret = colo_ctl_put(ctl, COLO_CHECKPOINT_LOADED); -- 1.7.12.4