From patchwork Fri Jun 3 07:52:44 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhanghailiang X-Patchwork-Id: 9152069 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 61A046072B for ; Fri, 3 Jun 2016 08:08:25 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 507B22675C for ; Fri, 3 Jun 2016 08:08:25 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 45285282E8; Fri, 3 Jun 2016 08:08: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 686502675C for ; Fri, 3 Jun 2016 08:08:21 +0000 (UTC) Received: from localhost ([::1]:53101 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1b8k9U-0002mw-5G for patchwork-qemu-devel@patchwork.kernel.org; Fri, 03 Jun 2016 04:08:20 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41789) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1b8jwQ-0007qC-CF for qemu-devel@nongnu.org; Fri, 03 Jun 2016 03:54:52 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1b8jwM-000553-8H for qemu-devel@nongnu.org; Fri, 03 Jun 2016 03:54:49 -0400 Received: from szxga03-in.huawei.com ([119.145.14.66]:25110) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1b8jwL-00054Z-JX for qemu-devel@nongnu.org; Fri, 03 Jun 2016 03:54:46 -0400 Received: from 172.24.1.36 (EHLO szxeml422-hub.china.huawei.com) ([172.24.1.36]) by szxrg03-dlp.huawei.com (MOS 4.4.3-GA FastPath queued) with ESMTP id CCR25168; Fri, 03 Jun 2016 15:53:32 +0800 (CST) Received: from localhost (10.177.24.212) by szxeml422-hub.china.huawei.com (10.82.67.152) with Microsoft SMTP Server id 14.3.235.1; Fri, 3 Jun 2016 15:53:19 +0800 From: zhanghailiang To: , , , Date: Fri, 3 Jun 2016 15:52:44 +0800 Message-ID: <1464940366-9880-33-git-send-email-zhang.zhanghailiang@huawei.com> X-Mailer: git-send-email 2.7.2.windows.1 In-Reply-To: <1464940366-9880-1-git-send-email-zhang.zhanghailiang@huawei.com> References: <1464940366-9880-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.0A090205.575137A8.0008, ss=1, re=0.000, recu=0.000, reip=0.000, cl=1, cld=1, fgs=0, ip=0.0.0.0, so=2013-05-26 15:14:31, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: 0ad2e3ebc42fc5d2e975edc1d38e236b X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4.x-2.6.x [generic] X-Received-From: 119.145.14.66 Subject: [Qemu-devel] [PATCH COLO-Frame v17 32/34] COLO/filter: Add each netdev a buffer filter 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, Jason Wang , yunhong.jiang@intel.com, eddie.dong@intel.com, peter.huangpeng@huawei.com, zhanghailiang , arei.gonglei@huawei.com, stefanha@redhat.com, zhangchen.fnst@cn.fujitsu.com, hongyang.yang@easystack.cn Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP For COLO periodic mode, it needs to buffer packets that sent by VM, and we will not release these packets until finish a checkpoint. Here, we add each netdev a buffer-filter that will be controlled by COLO. It is off by default, and the packets will not pass through these filters. If users don't enable COLO while configure qemu, these buffer-filters will not be added. Signed-off-by: zhanghailiang Cc: Jason Wang Cc: Yang Hongyang --- v16: - Remove the useless check in colo_add_buffer_filter() v15: - call object_new_with_props() directly to add filter in colo_add_buffer_filter. (Jason's suggestion) v14: - New patch --- include/migration/colo.h | 3 +++ include/net/filter.h | 2 ++ migration/colo-comm.c | 7 +++++++ migration/colo.c | 39 +++++++++++++++++++++++++++++++++++++++ net/filter-buffer.c | 2 -- stubs/migration-colo.c | 4 ++++ 6 files changed, 55 insertions(+), 2 deletions(-) diff --git a/include/migration/colo.h b/include/migration/colo.h index b16c642..b08715a 100644 --- a/include/migration/colo.h +++ b/include/migration/colo.h @@ -37,4 +37,7 @@ COLOMode get_colo_mode(void); void colo_do_failover(MigrationState *s); bool colo_handle_shutdown(void); +bool colo_shutdown(void); +void colo_add_buffer_filter(Notifier *notifier, void *data); + #endif diff --git a/include/net/filter.h b/include/net/filter.h index 0c4a2ea..817eaf4 100644 --- a/include/net/filter.h +++ b/include/net/filter.h @@ -21,6 +21,8 @@ #define NETFILTER_CLASS(klass) \ OBJECT_CLASS_CHECK(NetFilterClass, (klass), TYPE_NETFILTER) +#define TYPE_FILTER_BUFFER "filter-buffer" + typedef void (FilterSetup) (NetFilterState *nf, Error **errp); typedef void (FilterCleanup) (NetFilterState *nf); /* diff --git a/migration/colo-comm.c b/migration/colo-comm.c index 716a4f7..44ac76a 100644 --- a/migration/colo-comm.c +++ b/migration/colo-comm.c @@ -14,12 +14,14 @@ #include "qemu/osdep.h" #include #include "trace.h" +#include typedef struct { bool colo_requested; } COLOInfo; static COLOInfo colo_info; +static Notifier netdev_init_notifier; COLOMode get_colo_mode(void) { @@ -59,6 +61,11 @@ static const VMStateDescription colo_state = { void colo_info_init(void) { vmstate_register(NULL, 0, &colo_state, &colo_info); + /* FIXME: Remove this after COLO switch to using colo-proxy */ + if (colo_supported()) { + netdev_init_notifier.notify = colo_add_buffer_filter; + netdev_register_init_notifier(&netdev_init_notifier); + } } bool migration_incoming_enable_colo(void) diff --git a/migration/colo.c b/migration/colo.c index c995a1a..f9bd62c 100644 --- a/migration/colo.c +++ b/migration/colo.c @@ -20,11 +20,22 @@ #include "qapi/error.h" #include "migration/failover.h" #include "qapi-event.h" +#include "net/net.h" +#include "net/filter.h" +#include "net/vhost_net.h" static bool vmstate_loading; #define COLO_BUFFER_BASE_SIZE (4 * 1024 * 1024) +typedef struct COLOListNode { + void *opaque; + QLIST_ENTRY(COLOListNode) node; +} COLOListNode; + +static QLIST_HEAD(, COLOListNode) COLOBufferFilters = + QLIST_HEAD_INITIALIZER(COLOBufferFilters); + bool colo_supported(void) { return true; @@ -378,6 +389,34 @@ static int colo_prepare_before_save(MigrationState *s) return ret; } +void colo_add_buffer_filter(Notifier *notifier, void *data) +{ + char *netdev_id = data; + NetFilterState *nf; + char filter_name[128]; + Object *filter; + COLOListNode *filternode; + + snprintf(filter_name, sizeof(filter_name), + "%scolo", netdev_id); + + filter = object_new_with_props(TYPE_FILTER_BUFFER, + object_get_objects_root(), + filter_name, NULL, + "netdev", netdev_id, + "status", "off", + NULL); + if (!filter) { + return; + } + nf = NETFILTER(filter); + /* Only buffer the packets that sent out by VM */ + nf->direction = NET_FILTER_DIRECTION_RX; + filternode = g_new0(COLOListNode, 1); + filternode->opaque = nf; + QLIST_INSERT_HEAD(&COLOBufferFilters, filternode, node); +} + static void colo_process_checkpoint(MigrationState *s) { QIOChannelBuffer *bioc; diff --git a/net/filter-buffer.c b/net/filter-buffer.c index 346306a..d1cf595 100644 --- a/net/filter-buffer.c +++ b/net/filter-buffer.c @@ -17,8 +17,6 @@ #include "qapi-visit.h" #include "qom/object.h" -#define TYPE_FILTER_BUFFER "filter-buffer" - #define FILTER_BUFFER(obj) \ OBJECT_CHECK(FilterBufferState, (obj), TYPE_FILTER_BUFFER) diff --git a/stubs/migration-colo.c b/stubs/migration-colo.c index 167b191..ae29d47 100644 --- a/stubs/migration-colo.c +++ b/stubs/migration-colo.c @@ -49,3 +49,7 @@ bool colo_handle_shutdown(void) { return false; } + +void colo_add_buffer_filter(Notifier *notifier, void *data) +{ +}