From patchwork Tue Dec 22 10:42:53 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhang Chen X-Patchwork-Id: 560014 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 2C04F140BB2 for ; Tue, 22 Dec 2015 23:44:52 +1100 (AEDT) Received: from localhost ([::1]:50070 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aBMJ8-00074l-Bz for incoming@patchwork.ozlabs.org; Tue, 22 Dec 2015 07:44:50 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41476) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aBMDj-0005EV-89 for qemu-devel@nongnu.org; Tue, 22 Dec 2015 07:39:16 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aBMDi-00007B-1b for qemu-devel@nongnu.org; Tue, 22 Dec 2015 07:39:15 -0500 Received: from [59.151.112.132] (port=32502 helo=heian.cn.fujitsu.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aBMDh-0008WD-L8 for qemu-devel@nongnu.org; Tue, 22 Dec 2015 07:39:13 -0500 X-IronPort-AV: E=Sophos;i="5.20,346,1444665600"; d="scan'208";a="1856278" Received: from bogon (HELO cn.fujitsu.com) ([10.167.33.5]) by heian.cn.fujitsu.com with ESMTP; 22 Dec 2015 18:43:06 +0800 Received: from G08CNEXCHPEKD02.g08.fujitsu.local (unknown [10.167.33.83]) by cn.fujitsu.com (Postfix) with ESMTP id A2D5D41887C1; Tue, 22 Dec 2015 18:42:49 +0800 (CST) Received: from G08FNSTD140215.g08.fujitsu.local (10.167.226.56) by G08CNEXCHPEKD02.g08.fujitsu.local (10.167.33.89) with Microsoft SMTP Server (TLS) id 14.3.181.6; Tue, 22 Dec 2015 18:42:49 +0800 From: Zhang Chen To: qemu devel , Jason Wang , Stefan Hajnoczi Date: Tue, 22 Dec 2015 18:42:53 +0800 Message-ID: <1450780978-19123-6-git-send-email-zhangchen.fnst@cn.fujitsu.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1450780978-19123-1-git-send-email-zhangchen.fnst@cn.fujitsu.com> References: <1450780978-19123-1-git-send-email-zhangchen.fnst@cn.fujitsu.com> MIME-Version: 1.0 X-Originating-IP: [10.167.226.56] X-yoursite-MailScanner-ID: A2D5D41887C1.AF82B X-yoursite-MailScanner: Found to be clean X-yoursite-MailScanner-From: zhangchen.fnst@cn.fujitsu.com X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 59.151.112.132 Cc: Li Zhijian , Gui jianfeng , "eddie.dong" , "Dr. David Alan Gilbert" , Huang peng , Gong lei , jan.kiszka@siemens.com, Zhang Chen , Yang Hongyang , zhanghailiang Subject: [Qemu-devel] [RFC PATCH v2 05/10] net/colo-proxy: Add colo interface to use proxy 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 From: zhangchen Add interface used by migration/colo.c so colo framework can work with proxy Signed-off-by: zhangchen Signed-off-by: zhanghailiang --- net/colo-proxy.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/net/colo-proxy.c b/net/colo-proxy.c index f448ee1..ba2bbe7 100644 --- a/net/colo-proxy.c +++ b/net/colo-proxy.c @@ -167,6 +167,11 @@ static int connection_key_equal(const void *opaque1, const void *opaque2) return memcmp(opaque1, opaque2, sizeof(ConnectionKey)) == 0; } +bool colo_proxy_query_checkpoint(void) +{ + return colo_do_checkpoint; +} + static ssize_t colo_proxy_receive_iov(NetFilterState *nf, NetClientState *sender, unsigned flags, @@ -203,6 +208,94 @@ static void colo_proxy_cleanup(NetFilterState *nf) qemu_event_destroy(&s->need_compare_ev); } +static void colo_proxy_notify_checkpoint(void) +{ + trace_colo_proxy("colo_proxy_notify_checkpoint"); + colo_do_checkpoint = true; +} + +static void colo_proxy_start_one(NetFilterState *nf, + void *opaque, Error **errp) +{ + COLOProxyState *s; + int mode, ret; + + if (strcmp(object_get_typename(OBJECT(nf)), TYPE_FILTER_COLO_PROXY)) { + return; + } + + mode = *(int *)opaque; + s = FILTER_COLO_PROXY(nf); + assert(s->colo_mode == mode); + + if (s->colo_mode == COLO_MODE_PRIMARY) { + char thread_name[1024]; + + ret = colo_proxy_connect(s); + if (ret) { + error_setg(errp, "colo proxy connect failed"); + return ; + } + + s->status = COLO_PROXY_RUNNING; + sprintf(thread_name, "proxy compare %s", nf->netdev_id); + qemu_thread_create(&s->thread, thread_name, + colo_proxy_compare_thread, s, + QEMU_THREAD_JOINABLE); + } else { + ret = colo_wait_incoming(s); + if (ret) { + error_setg(errp, "colo proxy wait incoming failed"); + return ; + } + s->status = COLO_PROXY_RUNNING; + } +} + +int colo_proxy_start(int mode) +{ + Error *err = NULL; + qemu_foreach_netfilter(colo_proxy_start_one, &mode, &err); + if (err) { + return -1; + } + return 0; +} + +static void colo_proxy_stop_one(NetFilterState *nf, + void *opaque, Error **errp) +{ + COLOProxyState *s; + int mode; + + if (strcmp(object_get_typename(OBJECT(nf)), TYPE_FILTER_COLO_PROXY)) { + return; + } + + s = FILTER_COLO_PROXY(nf); + mode = *(int *)opaque; + assert(s->colo_mode == mode); + + s->status = COLO_PROXY_DONE; + if (s->sockfd >= 0) { + qemu_set_fd_handler(s->sockfd, NULL, NULL, NULL); + closesocket(s->sockfd); + } + if (s->colo_mode == COLO_MODE_PRIMARY) { + colo_proxy_primary_checkpoint(s); + qemu_event_set(&s->need_compare_ev); + qemu_thread_join(&s->thread); + } else { + colo_proxy_secondary_checkpoint(s); + } +} + +void colo_proxy_stop(int mode) +{ + Error *err = NULL; + qemu_foreach_netfilter(colo_proxy_stop_one, &mode, &err); +} + static void colo_proxy_setup(NetFilterState *nf, Error **errp) { COLOProxyState *s = FILTER_COLO_PROXY(nf);