From patchwork Sat Feb 6 09:28:35 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhanghailiang X-Patchwork-Id: 8242121 Return-Path: X-Original-To: patchwork-qemu-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 1D7BBBEEED for ; Sat, 6 Feb 2016 09:41:11 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 69C0B2025B for ; Sat, 6 Feb 2016 09:41:10 +0000 (UTC) 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.kernel.org (Postfix) with ESMTPS id DAB1020212 for ; Sat, 6 Feb 2016 09:41:08 +0000 (UTC) Received: from localhost ([::1]:52658 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aRzMa-0006XY-9F for patchwork-qemu-devel@patchwork.kernel.org; Sat, 06 Feb 2016 04:41:08 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38195) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aRzBl-0002oB-VK for qemu-devel@nongnu.org; Sat, 06 Feb 2016 04:29:59 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aRzBk-0001SP-TM for qemu-devel@nongnu.org; Sat, 06 Feb 2016 04:29:57 -0500 Received: from szxga02-in.huawei.com ([119.145.14.65]:19611) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aRzBk-0001RF-2y for qemu-devel@nongnu.org; Sat, 06 Feb 2016 04:29:56 -0500 Received: from 172.24.1.50 (EHLO SZXEML423-HUB.china.huawei.com) ([172.24.1.50]) by szxrg02-dlp.huawei.com (MOS 4.3.7-GA FastPath queued) with ESMTP id DBA12005; Sat, 06 Feb 2016 17:29:40 +0800 (CST) Received: from localhost (10.177.24.212) by SZXEML423-HUB.china.huawei.com (10.82.67.154) with Microsoft SMTP Server id 14.3.235.1; Sat, 6 Feb 2016 17:29:29 +0800 From: zhanghailiang To: Date: Sat, 6 Feb 2016 17:28:35 +0800 Message-ID: <1454750932-7556-24-git-send-email-zhang.zhanghailiang@huawei.com> X-Mailer: git-send-email 1.9.0.msysgit.0 In-Reply-To: <1454750932-7556-1-git-send-email-zhang.zhanghailiang@huawei.com> References: <1454750932-7556-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.0A020202.56B5BD04.00EB, ss=1, re=0.000, recu=0.000, reip=0.000, cl=1, cld=1, fgs=0, ip=0.0.0.0, so=2013-06-18 04:22:30, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: eb3a3ad9e802d74420e072884c96cc7e X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4.x-2.6.x [generic] X-Received-From: 119.145.14.65 Cc: xiecl.fnst@cn.fujitsu.com, lizhijian@cn.fujitsu.com, quintela@redhat.com, armbru@redhat.com, yunhong.jiang@intel.com, eddie.dong@intel.com, peter.huangpeng@huawei.com, dgilbert@redhat.com, zhanghailiang , arei.gonglei@huawei.com, stefanha@redhat.com, amit.shah@redhat.com, zhangchen.fnst@cn.fujitsu.com, hongyang.yang@easystack.cn Subject: [Qemu-devel] [PATCH COLO-Frame v14 23/40] COLO failover: Don't do failover during loading VM's 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+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org 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 5c87a8e..515d561 100644 --- a/migration/colo.c +++ b/migration/colo.c @@ -19,6 +19,8 @@ #include "migration/failover.h" #include "qapi-event.h" +static bool vmstate_loading; + /* colo buffer */ #define COLO_BUFFER_BASE_SIZE (4 * 1024 * 1024) @@ -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); @@ -560,13 +575,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_put_cmd(mis->to_src_file, COLO_MESSAGE_VMSTATE_LOADED, &local_err); if (local_err) { @@ -578,6 +602,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);