From patchwork Mon Feb 22 02:40:28 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhanghailiang X-Patchwork-Id: 8370891 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 40FF6C0553 for ; Mon, 22 Feb 2016 02:54:51 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 79374203B1 for ; Mon, 22 Feb 2016 02:54:50 +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 7FCD1203AB for ; Mon, 22 Feb 2016 02:54:49 +0000 (UTC) Received: from localhost ([::1]:46186 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aXge8-0004xQ-Uq for patchwork-qemu-devel@patchwork.kernel.org; Sun, 21 Feb 2016 21:54:48 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59942) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aXgRp-0002DH-FD for qemu-devel@nongnu.org; Sun, 21 Feb 2016 21:42:06 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aXgRn-0007ZL-7O for qemu-devel@nongnu.org; Sun, 21 Feb 2016 21:42:05 -0500 Received: from szxga03-in.huawei.com ([119.145.14.66]:14049) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aXgRm-0007Ya-4B for qemu-devel@nongnu.org; Sun, 21 Feb 2016 21:42:03 -0500 Received: from 172.24.1.47 (EHLO SZXEML423-HUB.china.huawei.com) ([172.24.1.47]) by szxrg03-dlp.huawei.com (MOS 4.4.3-GA FastPath queued) with ESMTP id BWL15804; Mon, 22 Feb 2016 10:41:49 +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:41 +0800 From: zhanghailiang To: Date: Mon, 22 Feb 2016 10:40:28 +0800 Message-ID: <1456108832-24212-35-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.0A090201.56CA756E.001D, 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: afc828614d0522f992f44293c1d578b2 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4.x-2.6.x [generic] X-Received-From: 119.145.14.66 Cc: xiecl.fnst@cn.fujitsu.com, lizhijian@cn.fujitsu.com, quintela@redhat.com, armbru@redhat.com, Jason Wang , 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 34/38] COLO/filter: add each netdev a buffer filter 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 For COLO periodic mode, it need 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 disabled 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 --- 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 | 2 ++ include/net/filter.h | 2 ++ migration/colo-comm.c | 5 +++++ migration/colo.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++++ net/filter-buffer.c | 2 -- stubs/migration-colo.c | 4 ++++ 6 files changed, 62 insertions(+), 2 deletions(-) diff --git a/include/migration/colo.h b/include/migration/colo.h index 919b135..22b92c9 100644 --- a/include/migration/colo.h +++ b/include/migration/colo.h @@ -37,4 +37,6 @@ COLOMode get_colo_mode(void); void colo_do_failover(MigrationState *s); bool colo_shutdown(void); +void colo_add_buffer_filter(const char *netdev_id, void *opaque); + #endif diff --git a/include/net/filter.h b/include/net/filter.h index af3c53c..faccedd 100644 --- a/include/net/filter.h +++ b/include/net/filter.h @@ -22,6 +22,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 3943e94..91d873e 100644 --- a/migration/colo-comm.c +++ b/migration/colo-comm.c @@ -13,6 +13,7 @@ #include #include "trace.h" +#include typedef struct { bool colo_requested; @@ -58,6 +59,10 @@ 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 use colo-proxy */ + if (colo_supported()) { + netdev_init_add_handler(colo_add_buffer_filter, NULL); + } } bool migration_incoming_enable_colo(void) diff --git a/migration/colo.c b/migration/colo.c index 0140203..bbff4e8 100644 --- a/migration/colo.c +++ b/migration/colo.c @@ -18,12 +18,23 @@ #include "qemu/error-report.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; /* colo buffer */ #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; @@ -382,6 +393,44 @@ static int colo_prepare_before_save(MigrationState *s) return ret; } +void colo_add_buffer_filter(const char *netdev_id, void *opaque) +{ + NetFilterState *nf; + char filter_name[128]; + Object *filter; + COLOListNode *filternode; + NetClientState *nc = qemu_find_netdev(netdev_id); + + /* FIXME: Not support multiple queues */ + if (!nc || nc->queue_index > 1) { + return; + } + + /* Not support vhost-net */ + if (get_vhost_net(nc)) { + return; + } + + 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", "disable", + 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) { QEMUSizedBuffer *buffer = NULL; diff --git a/net/filter-buffer.c b/net/filter-buffer.c index f0a9151..34dc312 100644 --- a/net/filter-buffer.c +++ b/net/filter-buffer.c @@ -16,8 +16,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 1996cd9..8e74acb 100644 --- a/stubs/migration-colo.c +++ b/stubs/migration-colo.c @@ -48,3 +48,7 @@ bool colo_shutdown(void) { return false; } + +void colo_add_buffer_filter(const char *netdev_id, void *opaque) +{ +}