[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH COLO-Frame v18 32/34] COLO/filter: Add each netdev a
From: |
zhanghailiang |
Subject: |
[Qemu-devel] [PATCH COLO-Frame v18 32/34] COLO/filter: Add each netdev a buffer filter |
Date: |
Wed, 3 Aug 2016 20:26:10 +0800 |
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 <address@hidden>
Cc: Jason Wang <address@hidden>
Cc: Yang Hongyang <address@hidden>
---
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 <migration/colo.h>
#include "trace.h"
+#include <net/net.h>
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 f618ca6..9af48da 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)
+{
+}
--
1.8.3.1
- Re: [Qemu-devel] [PATCH COLO-Frame v18 12/34] COLO: Load VMState into buffer before restore it, (continued)
- [Qemu-devel] [PATCH COLO-Frame v18 28/34] COLO: Separate the process of saving/loading ram and device state, zhanghailiang, 2016/08/03
- [Qemu-devel] [PATCH COLO-Frame v18 10/34] COLO: Load PVM's dirty pages into SVM's RAM cache temporarily, zhanghailiang, 2016/08/03
- [Qemu-devel] [PATCH COLO-Frame v18 24/34] COLO: Update the global runstate after going into colo state, zhanghailiang, 2016/08/03
- [Qemu-devel] [PATCH COLO-Frame v18 20/34] qmp event: Add COLO_EXIT event to notify users while exited from COLO, zhanghailiang, 2016/08/03
- [Qemu-devel] [PATCH COLO-Frame v18 05/34] migration: Integrate COLO checkpoint process into loadvm, zhanghailiang, 2016/08/03
- [Qemu-devel] [PATCH COLO-Frame v18 11/34] ram/COLO: Record the dirty pages that SVM received, zhanghailiang, 2016/08/03
- [Qemu-devel] [PATCH COLO-Frame v18 02/34] migration: Introduce capability 'x-colo' to migration, zhanghailiang, 2016/08/03
- [Qemu-devel] [PATCH COLO-Frame v18 32/34] COLO/filter: Add each netdev a buffer filter,
zhanghailiang <=
- [Qemu-devel] [PATCH COLO-Frame v18 31/34] net: Add notifier/callback for netdev init, zhanghailiang, 2016/08/03
- [Qemu-devel] [PATCH COLO-Frame v18 06/34] COLO/migration: Create a new communication path from destination to source, zhanghailiang, 2016/08/03
- [Qemu-devel] [PATCH COLO-Frame v18 03/34] COLO: migrate colo related info to secondary node, zhanghailiang, 2016/08/03
- [Qemu-devel] [PATCH COLO-Frame v18 17/34] COLO failover: Introduce state to record failover process, zhanghailiang, 2016/08/03
- [Qemu-devel] [PATCH COLO-Frame v18 25/34] savevm: Introduce two helper functions for save/find loadvm_handlers entry, zhanghailiang, 2016/08/03
- [Qemu-devel] [PATCH COLO-Frame v18 27/34] migration/savevm: Export two helper functions for savevm process, zhanghailiang, 2016/08/03
- [Qemu-devel] [PATCH COLO-Frame v18 34/34] COLO: Add block replication into colo process, zhanghailiang, 2016/08/03
- [Qemu-devel] [PATCH COLO-Frame v18 04/34] migration: Integrate COLO checkpoint process into migration, zhanghailiang, 2016/08/03