From patchwork Thu Sep 1 03:24:20 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhanghailiang X-Patchwork-Id: 9308281 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 5D77760760 for ; Thu, 1 Sep 2016 03:34:49 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4B28B254F7 for ; Thu, 1 Sep 2016 03:34:49 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3B96729147; Thu, 1 Sep 2016 03:34:49 +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 C370E254F7 for ; Thu, 1 Sep 2016 03:34:48 +0000 (UTC) Received: from localhost ([::1]:56873 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bfIm7-0000qB-Un for patchwork-qemu-devel@patchwork.kernel.org; Wed, 31 Aug 2016 23:34:48 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44722) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bfIcv-0000Sm-Au for qemu-devel@nongnu.org; Wed, 31 Aug 2016 23:25:18 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bfIcr-0004D0-0L for qemu-devel@nongnu.org; Wed, 31 Aug 2016 23:25:17 -0400 Received: from szxga03-in.huawei.com ([119.145.14.66]:40988) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bfIcq-0004Cc-Bl for qemu-devel@nongnu.org; Wed, 31 Aug 2016 23:25:12 -0400 Received: from 172.24.1.136 (EHLO szxeml434-hub.china.huawei.com) ([172.24.1.136]) by szxrg03-dlp.huawei.com (MOS 4.4.3-GA FastPath queued) with ESMTP id CHE21783; Thu, 01 Sep 2016 11:25:09 +0800 (CST) Received: from localhost (10.177.24.212) by szxeml434-hub.china.huawei.com (10.82.67.225) with Microsoft SMTP Server id 14.3.235.1; Thu, 1 Sep 2016 11:24:48 +0800 From: zhanghailiang To: Date: Thu, 1 Sep 2016 11:24:20 +0800 Message-ID: <1472700265-16760-18-git-send-email-zhang.zhanghailiang@huawei.com> X-Mailer: git-send-email 2.7.2.windows.1 In-Reply-To: <1472700265-16760-1-git-send-email-zhang.zhanghailiang@huawei.com> References: <1472700265-16760-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.0A020204.57C79F95.01E9, 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: 0791a5a17e1e657db5d998fb52262d43 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 v19 17/22] COLO: Don't do failover while 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, quintela@redhat.com, peter.huangpeng@huawei.com, dgilbert@redhat.com, amit.shah@redhat.com, zhangchen.fnst@cn.fujitsu.com, zhanghailiang 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 --- v19: - fix title 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 fc89438..69d1948 100644 --- a/migration/colo.c +++ b/migration/colo.c @@ -20,6 +20,8 @@ #include "qapi/error.h" #include "migration/failover.h" +static bool vmstate_loading; + #define COLO_BUFFER_BASE_SIZE (4 * 1024 * 1024) bool colo_supported(void) @@ -51,6 +53,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); @@ -532,13 +547,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) { @@ -547,6 +571,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);