From patchwork Fri Jun 3 07:52:34 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhanghailiang X-Patchwork-Id: 9152105 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id DC9D96072B for ; Fri, 3 Jun 2016 08:19:18 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C9DE32675C for ; Fri, 3 Jun 2016 08:19:18 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id BEB6428309; Fri, 3 Jun 2016 08:19:18 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 221702675C for ; Fri, 3 Jun 2016 08:19:18 +0000 (UTC) Received: from localhost ([::1]:53162 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1b8kK5-0004p0-8v for patchwork-qemu-devel@patchwork.kernel.org; Fri, 03 Jun 2016 04:19:17 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41528) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1b8jvx-0007LO-3g for qemu-devel@nongnu.org; Fri, 03 Jun 2016 03:54:22 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1b8jvs-0004sl-W7 for qemu-devel@nongnu.org; Fri, 03 Jun 2016 03:54:20 -0400 Received: from szxga03-in.huawei.com ([119.145.14.66]:24535) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1b8jvs-0004rs-Ap for qemu-devel@nongnu.org; Fri, 03 Jun 2016 03:54:16 -0400 Received: from 172.24.1.36 (EHLO szxeml425-hub.china.huawei.com) ([172.24.1.36]) by szxrg03-dlp.huawei.com (MOS 4.4.3-GA FastPath queued) with ESMTP id CCR25139; Fri, 03 Jun 2016 15:53:22 +0800 (CST) Received: from localhost (10.177.24.212) by szxeml425-hub.china.huawei.com (10.82.67.180) with Microsoft SMTP Server id 14.3.235.1; Fri, 3 Jun 2016 15:53:11 +0800 From: zhanghailiang To: , , , Date: Fri, 3 Jun 2016 15:52:34 +0800 Message-ID: <1464940366-9880-23-git-send-email-zhang.zhanghailiang@huawei.com> X-Mailer: git-send-email 2.7.2.windows.1 In-Reply-To: <1464940366-9880-1-git-send-email-zhang.zhanghailiang@huawei.com> References: <1464940366-9880-1-git-send-email-zhang.zhanghailiang@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.177.24.212] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A090205.57513795.0038, ss=1, re=0.000, recu=0.000, reip=0.000, cl=1, cld=1, fgs=0, ip=0.0.0.0, so=2013-05-26 15:14:31, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: aa73f7ff2dedfefb78c4ccc41f7f2287 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4.x-2.6.x [generic] X-Received-From: 119.145.14.66 Subject: [Qemu-devel] [PATCH COLO-Frame v17 22/34] COLO failover: Don't do failover during loading VM's state X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: xiecl.fnst@cn.fujitsu.com, lizhijian@cn.fujitsu.com, yunhong.jiang@intel.com, eddie.dong@intel.com, peter.huangpeng@huawei.com, zhanghailiang , arei.gonglei@huawei.com, stefanha@redhat.com, zhangchen.fnst@cn.fujitsu.com, hongyang.yang@easystack.cn Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP We should not do failover work while the main thread is loading VM's state. Otherwise it will destroy the consistent of VM's memory and device state. Here we add a new failover status 'RELAUNCH' which means we should relaunch the process of failover. Signed-off-by: zhanghailiang Signed-off-by: Li Zhijian Reviewed-by: Dr. David Alan Gilbert --- v14: - Move the place of 'vmstate_loading = false;'. v13: - Add Reviewed-by tag --- include/migration/failover.h | 2 ++ migration/colo.c | 25 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/include/migration/failover.h b/include/migration/failover.h index c4bd81e..99b0d58 100644 --- a/include/migration/failover.h +++ b/include/migration/failover.h @@ -20,6 +20,8 @@ typedef enum COLOFailoverStatus { FAILOVER_STATUS_REQUEST = 1, /* Request but not handled */ FAILOVER_STATUS_HANDLING = 2, /* In the process of handling failover */ FAILOVER_STATUS_COMPLETED = 3, /* Finish the failover process */ + /* Optional, Relaunch the failover process, again 'NONE' -> 'COMPLETED' */ + FAILOVER_STATUS_RELAUNCH = 4, } COLOFailoverStatus; void failover_init_state(void); diff --git a/migration/colo.c b/migration/colo.c index ff7b77b..dab615b 100644 --- a/migration/colo.c +++ b/migration/colo.c @@ -21,6 +21,8 @@ #include "migration/failover.h" #include "qapi-event.h" +static bool vmstate_loading; + #define COLO_BUFFER_BASE_SIZE (4 * 1024 * 1024) bool colo_supported(void) @@ -52,6 +54,19 @@ static void secondary_vm_do_failover(void) int old_state; MigrationIncomingState *mis = migration_incoming_get_current(); + /* Can not do failover during the process of VM's loading VMstate, Or + * it will break the secondary VM. + */ + if (vmstate_loading) { + old_state = failover_set_state(FAILOVER_STATUS_HANDLING, + FAILOVER_STATUS_RELAUNCH); + if (old_state != FAILOVER_STATUS_HANDLING) { + error_report("Unknown error while do failover for secondary VM," + "old_state: %d", old_state); + } + return; + } + migrate_set_state(&mis->state, MIGRATION_STATUS_COLO, MIGRATION_STATUS_COMPLETED); @@ -553,13 +568,22 @@ void *colo_process_incoming_thread(void *opaque) qemu_mutex_lock_iothread(); qemu_system_reset(VMRESET_SILENT); + vmstate_loading = true; if (qemu_loadvm_state(fb) < 0) { error_report("COLO: loadvm failed"); qemu_mutex_unlock_iothread(); goto out; } + + vmstate_loading = false; qemu_mutex_unlock_iothread(); + if (failover_get_state() == FAILOVER_STATUS_RELAUNCH) { + failover_set_state(FAILOVER_STATUS_RELAUNCH, FAILOVER_STATUS_NONE); + failover_request_active(NULL); + goto out; + } + colo_send_message(mis->to_src_file, COLO_MESSAGE_VMSTATE_LOADED, &local_err); if (local_err) { @@ -568,6 +592,7 @@ void *colo_process_incoming_thread(void *opaque) } out: + vmstate_loading = false; /* Throw the unreported error message after exited from loop */ if (local_err) { error_report_err(local_err);