[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH COLO-Frame v15 34/38] COLO/filter: add each netdev a
From: |
zhanghailiang |
Subject: |
[Qemu-devel] [PATCH COLO-Frame v15 34/38] COLO/filter: add each netdev a buffer filter |
Date: |
Mon, 22 Feb 2016 10:40:28 +0800 |
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 <address@hidden>
Cc: Jason Wang <address@hidden>
Cc: Yang Hongyang <address@hidden>
---
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 <migration/colo.h>
#include "trace.h"
+#include <net/net.h>
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)
+{
+}
--
1.8.3.1
- [Qemu-devel] [PATCH COLO-Frame v15 25/38] COLO: Update the global runstate after going into colo state, (continued)
- [Qemu-devel] [PATCH COLO-Frame v15 25/38] COLO: Update the global runstate after going into colo state, zhanghailiang, 2016/02/21
- [Qemu-devel] [PATCH COLO-Frame v15 30/38] COLO: Split qemu_savevm_state_begin out of checkpoint process, zhanghailiang, 2016/02/21
- [Qemu-devel] [PATCH COLO-Frame v15 18/38] COLO failover: Introduce state to record failover process, zhanghailiang, 2016/02/21
- [Qemu-devel] [PATCH COLO-Frame v15 24/38] COLO: Process shutdown command for VM in COLO state, zhanghailiang, 2016/02/21
- [Qemu-devel] [PATCH COLO-Frame v15 29/38] COLO: Separate the process of saving/loading ram and device state, zhanghailiang, 2016/02/21
- [Qemu-devel] [PATCH COLO-Frame v15 33/38] net: Add notifier/callback for netdev init, zhanghailiang, 2016/02/21
- [Qemu-devel] [PATCH COLO-Frame v15 13/38] COLO: Load VMState into qsb before restore it, zhanghailiang, 2016/02/21
- [Qemu-devel] [PATCH COLO-Frame v15 32/38] filter-buffer: Accept zero interval, zhanghailiang, 2016/02/21
- [Qemu-devel] [PATCH COLO-Frame v15 35/38] COLO: manage the status of buffer filters for PVM, zhanghailiang, 2016/02/21
- [Qemu-devel] [PATCH COLO-Frame v15 26/38] savevm: Introduce two helper functions for save/find loadvm_handlers entry, zhanghailiang, 2016/02/21
- [Qemu-devel] [PATCH COLO-Frame v15 34/38] COLO/filter: add each netdev a buffer filter,
zhanghailiang <=
- [Qemu-devel] [PATCH COLO-Frame v15 21/38] qmp event: Add COLO_EXIT event to notify users while exited from COLO, zhanghailiang, 2016/02/21
- [Qemu-devel] [PATCH COLO-Frame v15 31/38] net/filter: Add a 'status' property for filter object, zhanghailiang, 2016/02/21
- [Qemu-devel] [PATCH COLO-Frame v15 38/38] COLO: Add block replication into colo process, zhanghailiang, 2016/02/21
- [Qemu-devel] [PATCH COLO-Frame v15 22/38] COLO failover: Shutdown related socket fd when do failover, zhanghailiang, 2016/02/21
- [Qemu-devel] [PATCH COLO-Frame v15 36/38] filter-buffer: make filter_buffer_flush() public, zhanghailiang, 2016/02/21
- [Qemu-devel] [PATCH COLO-Frame v15 37/38] COLO: flush buffered packets in checkpoint process or exit COLO, zhanghailiang, 2016/02/21
- [Qemu-devel] [PATCH COLO-Frame v15 16/38] COLO: synchronize PVM's state to SVM periodically, zhanghailiang, 2016/02/21
- [Qemu-devel] [PATCH COLO-Frame v15 27/38] migration/savevm: Add new helpers to process the different stages of loadvm, zhanghailiang, 2016/02/21
- [Qemu-devel] [PATCH COLO-Frame v15 28/38] migration/savevm: Export two helper functions for savevm process, zhanghailiang, 2016/02/21