From patchwork Thu Feb 12 03:16:52 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhanghailiang X-Patchwork-Id: 439040 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id A4EE21400EA for ; Thu, 12 Feb 2015 14:31:56 +1100 (AEDT) Received: from localhost ([::1]:48213 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YLkVO-0001Nk-Ko for incoming@patchwork.ozlabs.org; Wed, 11 Feb 2015 22:31:54 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36080) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YLkJ2-0003qY-KM for qemu-devel@nongnu.org; Wed, 11 Feb 2015 22:19:12 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YLkIw-0005n5-5A for qemu-devel@nongnu.org; Wed, 11 Feb 2015 22:19:08 -0500 Received: from szxga01-in.huawei.com ([119.145.14.64]:44376) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YLkIv-0005mO-C7 for qemu-devel@nongnu.org; Wed, 11 Feb 2015 22:19:02 -0500 Received: from 172.24.2.119 (EHLO SZXEML429-HUB.china.huawei.com) ([172.24.2.119]) by szxrg01-dlp.huawei.com (MOS 4.3.7-GA FastPath queued) with ESMTP id CJK65154; Thu, 12 Feb 2015 11:18:46 +0800 (CST) Received: from localhost (10.177.22.69) by SZXEML429-HUB.china.huawei.com (10.82.67.184) with Microsoft SMTP Server id 14.3.158.1; Thu, 12 Feb 2015 11:17:53 +0800 From: zhanghailiang To: Date: Thu, 12 Feb 2015 11:16:52 +0800 Message-ID: <1423711034-5340-6-git-send-email-zhang.zhanghailiang@huawei.com> X-Mailer: git-send-email 1.9.2.msysgit.0 In-Reply-To: <1423711034-5340-1-git-send-email-zhang.zhanghailiang@huawei.com> References: <1423711034-5340-1-git-send-email-zhang.zhanghailiang@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.177.22.69] X-CFilter-Loop: Reflected X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4.x-2.6.x [generic] X-Received-From: 119.145.14.64 Cc: zhanghailiang , Li Zhijian , yunhong.jiang@intel.com, eddie.dong@intel.com, dgilbert@redhat.com, peter.huangpeng@huawei.com, stefanha@redhat.com, pbonzini@redhat.com, Yang Hongyang , Lai Jiangshan Subject: [Qemu-devel] [PATCH RFC v3 05/27] migration: Integrate COLO checkpoint process into loadvm 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Switch from normal migration loadvm process into COLO checkpoint process if COLO mode is enabled. Signed-off-by: zhanghailiang Signed-off-by: Li Zhijian Signed-off-by: Lai Jiangshan Signed-off-by: Yang Hongyang --- include/migration/migration-colo.h | 14 +++++++++++++- migration/colo-comm.c | 10 ++++++++++ migration/colo.c | 15 ++++++++++++++- migration/migration.c | 21 ++++++++++++++++++++- stubs/migration-colo.c | 5 +++++ 5 files changed, 62 insertions(+), 3 deletions(-) diff --git a/include/migration/migration-colo.h b/include/migration/migration-colo.h index b72662c..9f1443b 100644 --- a/include/migration/migration-colo.h +++ b/include/migration/migration-colo.h @@ -15,9 +15,21 @@ #include "qemu-common.h" #include "migration/migration.h" +#include "block/coroutine.h" +#include "qemu/thread.h" void colo_info_mig_init(void); -void colo_init_checkpointer(MigrationState *s); +struct colo_incoming { + QEMUFile *file; + QemuThread thread; +}; +void colo_init_checkpointer(MigrationState *s); +/* loadvm */ +extern Coroutine *migration_incoming_co; +bool loadvm_enable_colo(void); +void loadvm_exit_colo(void); +void *colo_process_incoming_checkpoints(void *opaque); +bool loadvm_in_colo_state(void); #endif diff --git a/migration/colo-comm.c b/migration/colo-comm.c index 8caa948..038d12f 100644 --- a/migration/colo-comm.c +++ b/migration/colo-comm.c @@ -54,3 +54,13 @@ void colo_info_mig_init(void) register_savevm_live(NULL, "colo", -1, 1, &savevm_colo_info_handlers, NULL); } + +bool loadvm_enable_colo(void) +{ + return colo_requested; +} + +void loadvm_exit_colo(void) +{ + colo_requested = false; +} diff --git a/migration/colo.c b/migration/colo.c index f40b0d8..b54bb52 100644 --- a/migration/colo.c +++ b/migration/colo.c @@ -24,7 +24,7 @@ do { fprintf(stdout, "colo: " fmt , ## __VA_ARGS__); } while (0) #endif static QEMUBH *colo_bh; - +static Coroutine *colo; static void *colo_thread(void *opaque) { MigrationState *s = opaque; @@ -70,3 +70,16 @@ void colo_init_checkpointer(MigrationState *s) colo_bh = qemu_bh_new(colo_start_checkpointer, s); qemu_bh_schedule(colo_bh); } + +void *colo_process_incoming_checkpoints(void *opaque) +{ + colo = qemu_coroutine_self(); + assert(colo != NULL); + + /* TODO: COLO checkpoint restore loop */ + + colo = NULL; + loadvm_exit_colo(); + + return NULL; +} diff --git a/migration/migration.c b/migration/migration.c index 536ba01e..81f911f 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -79,6 +79,7 @@ void qemu_start_incoming_migration(const char *uri, Error **errp) } } +Coroutine *migration_incoming_co; static void process_incoming_migration_co(void *opaque) { QEMUFile *f = opaque; @@ -86,7 +87,25 @@ static void process_incoming_migration_co(void *opaque) int ret; ret = qemu_loadvm_state(f); - qemu_fclose(f); + + /* we get colo info, and know if we are in colo mode */ + if (loadvm_enable_colo()) { + struct colo_incoming *colo_in = g_malloc0(sizeof(*colo_in)); + + colo_in->file = f; + migration_incoming_co = qemu_coroutine_self(); + qemu_thread_create(&colo_in->thread, "colo incoming", + colo_process_incoming_checkpoints, colo_in, QEMU_THREAD_JOINABLE); + qemu_coroutine_yield(); + migration_incoming_co = NULL; +#if 0 + /* FIXME wait checkpoint incoming thread exit, and free resource */ + qemu_thread_join(&colo_in->thread); + g_free(colo_in); +#endif + } else { + qemu_fclose(f); + } free_xbzrle_decoded_buf(); if (ret < 0) { error_report("load of migration failed: %s", strerror(-ret)); diff --git a/stubs/migration-colo.c b/stubs/migration-colo.c index b2cff9c..7a3dbc5 100644 --- a/stubs/migration-colo.c +++ b/stubs/migration-colo.c @@ -15,3 +15,8 @@ void colo_init_checkpointer(MigrationState *s) { } + +void *colo_process_incoming_checkpoints(void *opaque) +{ + return NULL; +}