From patchwork Mon Feb 22 02:40:17 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhanghailiang X-Patchwork-Id: 8370461 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 9A599C0553 for ; Mon, 22 Feb 2016 02:45:41 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id E70CC20383 for ; Mon, 22 Feb 2016 02:45:40 +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 1C4B620382 for ; Mon, 22 Feb 2016 02:45:40 +0000 (UTC) Received: from localhost ([::1]:46084 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aXgVH-0001T2-Bt for patchwork-qemu-devel@patchwork.kernel.org; Sun, 21 Feb 2016 21:45:39 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59793) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aXgRY-0001a1-NY for qemu-devel@nongnu.org; Sun, 21 Feb 2016 21:41:51 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aXgRX-0007VQ-Le for qemu-devel@nongnu.org; Sun, 21 Feb 2016 21:41:48 -0500 Received: from szxga02-in.huawei.com ([119.145.14.65]:8938) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aXgRW-0007Ug-Kd for qemu-devel@nongnu.org; Sun, 21 Feb 2016 21:41:47 -0500 Received: from 172.24.1.51 (EHLO SZXEML423-HUB.china.huawei.com) ([172.24.1.51]) by szxrg02-dlp.huawei.com (MOS 4.3.7-GA FastPath queued) with ESMTP id DBU14397; Mon, 22 Feb 2016 10:41:29 +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; Mon, 22 Feb 2016 10:41:21 +0800 From: zhanghailiang To: Date: Mon, 22 Feb 2016 10:40:17 +0800 Message-ID: <1456108832-24212-24-git-send-email-zhang.zhanghailiang@huawei.com> X-Mailer: git-send-email 1.9.0.msysgit.0 In-Reply-To: <1456108832-24212-1-git-send-email-zhang.zhanghailiang@huawei.com> References: <1456108832-24212-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.56CA755A.0061, 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: 3746248a862393770dec589789146d1a 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 v15 23/38] 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);