From patchwork Thu Sep 1 03:24:16 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhanghailiang X-Patchwork-Id: 9308303 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 C9111607D6 for ; Thu, 1 Sep 2016 03:42:25 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C26CE2911D for ; Thu, 1 Sep 2016 03:42:25 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B74E729147; Thu, 1 Sep 2016 03:42:25 +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 C9D5D2911D for ; Thu, 1 Sep 2016 03:42:24 +0000 (UTC) Received: from localhost ([::1]:56914 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bfItT-00083h-9X for patchwork-qemu-devel@patchwork.kernel.org; Wed, 31 Aug 2016 23:42:23 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44604) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bfIci-0000C6-Mo for qemu-devel@nongnu.org; Wed, 31 Aug 2016 23:25:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bfIcd-00045y-R9 for qemu-devel@nongnu.org; Wed, 31 Aug 2016 23:25:04 -0400 Received: from szxga02-in.huawei.com ([119.145.14.65]:43558) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bfIcd-00045Q-54 for qemu-devel@nongnu.org; Wed, 31 Aug 2016 23:24:59 -0400 Received: from 172.24.1.136 (EHLO SZXEML423-HUB.china.huawei.com) ([172.24.1.136]) by szxrg02-dlp.huawei.com (MOS 4.3.7-GA FastPath queued) with ESMTP id DMM19180; Thu, 01 Sep 2016 11:24:54 +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; Thu, 1 Sep 2016 11:24:45 +0800 From: zhanghailiang To: Date: Thu, 1 Sep 2016 11:24:16 +0800 Message-ID: <1472700265-16760-14-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.57C79F86.0116, 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: 4fa006067c07be2552feb67ac72aa664 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4.x-2.6.x [generic] X-Received-From: 119.145.14.65 Subject: [Qemu-devel] [PATCH COLO-Frame v19 13/22] COLO: Introduce state to record failover process 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 When handling failover, COLO processes differently according to the different stage of failover process, here we introduce a global atomic variable to record the status of failover. We add four failover status to indicate the different stage of failover process. You should use the helpers to get and set the value. Signed-off-by: zhanghailiang Reviewed-by: Dr. David Alan Gilbert --- v19: - fix comments v11: - fix several typos found by Dave - Add Reviewed-by tag --- include/migration/failover.h | 10 ++++++++++ migration/colo-failover.c | 37 +++++++++++++++++++++++++++++++++++++ migration/colo.c | 4 ++++ migration/trace-events | 1 + 4 files changed, 52 insertions(+) diff --git a/include/migration/failover.h b/include/migration/failover.h index 3274735..fe71bb4 100644 --- a/include/migration/failover.h +++ b/include/migration/failover.h @@ -15,6 +15,16 @@ #include "qemu-common.h" +typedef enum COLOFailoverStatus { + FAILOVER_STATUS_NONE = 0, + 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 */ +} COLOFailoverStatus; + +void failover_init_state(void); +int failover_set_state(int old_state, int new_state); +int failover_get_state(void); void failover_request_active(Error **errp); #endif diff --git a/migration/colo-failover.c b/migration/colo-failover.c index e31fc10..82196b2 100644 --- a/migration/colo-failover.c +++ b/migration/colo-failover.c @@ -15,22 +15,59 @@ #include "migration/failover.h" #include "qmp-commands.h" #include "qapi/qmp/qerror.h" +#include "qemu/error-report.h" +#include "trace.h" static QEMUBH *failover_bh; +static COLOFailoverStatus failover_state; static void colo_failover_bh(void *opaque) { + int old_state; + qemu_bh_delete(failover_bh); failover_bh = NULL; + old_state = failover_set_state(FAILOVER_STATUS_REQUEST, + FAILOVER_STATUS_HANDLING); + if (old_state != FAILOVER_STATUS_REQUEST) { + error_report("Unknown error for failover, old_state = %d", old_state); + return; + } /* TODO: Do failover work */ } void failover_request_active(Error **errp) { + if (failover_set_state(FAILOVER_STATUS_NONE, FAILOVER_STATUS_REQUEST) + != FAILOVER_STATUS_NONE) { + error_setg(errp, "COLO failover is already actived"); + return; + } failover_bh = qemu_bh_new(colo_failover_bh, NULL); qemu_bh_schedule(failover_bh); } +void failover_init_state(void) +{ + failover_state = FAILOVER_STATUS_NONE; +} + +int failover_set_state(int old_state, int new_state) +{ + int old; + + old = atomic_cmpxchg(&failover_state, old_state, new_state); + if (old == old_state) { + trace_colo_failover_set_state(new_state); + } + return old; +} + +int failover_get_state(void) +{ + return atomic_read(&failover_state); +} + void qmp_x_colo_lost_heartbeat(Error **errp) { if (get_colo_mode() == COLO_MODE_UNKNOWN) { diff --git a/migration/colo.c b/migration/colo.c index 31b3029..b94972c 100644 --- a/migration/colo.c +++ b/migration/colo.c @@ -232,6 +232,8 @@ static void colo_process_checkpoint(MigrationState *s) Error *local_err = NULL; int ret; + failover_init_state(); + s->rp_state.from_dst_file = qemu_file_get_return_path(s->to_dst_file); if (!s->rp_state.from_dst_file) { error_report("Open QEMUFile from_dst_file failed"); @@ -330,6 +332,8 @@ void *colo_process_incoming_thread(void *opaque) migrate_set_state(&mis->state, MIGRATION_STATUS_ACTIVE, MIGRATION_STATUS_COLO); + failover_init_state(); + mis->to_src_file = qemu_file_get_return_path(mis->from_src_file); if (!mis->to_src_file) { error_report("COLO incoming thread: Open QEMUFile to_src_file failed"); diff --git a/migration/trace-events b/migration/trace-events index f374c8c..d7b0438 100644 --- a/migration/trace-events +++ b/migration/trace-events @@ -212,3 +212,4 @@ migration_tls_incoming_handshake_complete(void) "" colo_vm_state_change(const char *old, const char *new) "Change '%s' => '%s'" colo_send_message(const char *msg) "Send '%s' message" colo_receive_message(const char *msg) "Receive '%s' message" +colo_failover_set_state(int new_state) "new state %d"