[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH RFC v3 20/27] COLO NIC : Implement colo nic init/des
From: |
zhanghailiang |
Subject: |
[Qemu-devel] [PATCH RFC v3 20/27] COLO NIC : Implement colo nic init/destroy function |
Date: |
Thu, 12 Feb 2015 11:17:07 +0800 |
When in colo mode, call colo nic init/destroy function.
Signed-off-by: zhanghailiang <address@hidden>
Signed-off-by: Gao feng <address@hidden>
Signed-off-by: Li Zhijian <address@hidden>
---
include/net/colo-nic.h | 2 ++
migration/colo.c | 17 +++++++++++
net/colo-nic.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 99 insertions(+)
diff --git a/include/net/colo-nic.h b/include/net/colo-nic.h
index d35ee17..40dbcfb 100644
--- a/include/net/colo-nic.h
+++ b/include/net/colo-nic.h
@@ -14,6 +14,8 @@
#ifndef COLO_NIC_H
#define COLO_NIC_H
+int colo_proxy_init(int side);
+void colo_proxy_destroy(int side);
void colo_add_nic_devices(NetClientState *nc);
void colo_remove_nic_devices(NetClientState *nc);
diff --git a/migration/colo.c b/migration/colo.c
index 82459ec..9f8a873 100644
--- a/migration/colo.c
+++ b/migration/colo.c
@@ -14,6 +14,7 @@
#include "migration/migration-colo.h"
#include "qemu/error-report.h"
#include "migration/migration-failover.h"
+#include "net/colo-nic.h"
/* #define DEBUG_COLO */
@@ -286,6 +287,12 @@ static void *colo_thread(void *opaque)
QEMUFile *colo_control = NULL;
int ret;
+ if (colo_proxy_init(COLO_PRIMARY_MODE) != 0) {
+ error_report("Init colo proxy error");
+ goto out;
+ }
+ DPRINTF("proxy init complete\n");
+
colo_control = qemu_fopen_socket(qemu_get_fd(s->file), "rb");
if (!colo_control) {
error_report("Open colo_control failed!");
@@ -346,6 +353,8 @@ out:
qemu_bh_schedule(s->cleanup_bh);
qemu_mutex_unlock_iothread();
+ colo_proxy_destroy(COLO_PRIMARY_MODE);
+
return NULL;
}
@@ -414,6 +423,13 @@ void *colo_process_incoming_checkpoints(void *opaque)
colo = qemu_coroutine_self();
assert(colo != NULL);
+ /* configure the network */
+ if (colo_proxy_init(COLO_SECONDARY_MODE) != 0) {
+ error_report("Init colo proxy error\n");
+ goto out;
+ }
+ DPRINTF("proxy init complete\n");
+
ctl = qemu_fopen_socket(fd, "wb");
if (!ctl) {
error_report("Can't open incoming channel!");
@@ -560,5 +576,6 @@ out:
loadvm_exit_colo();
+ colo_proxy_destroy(COLO_SECONDARY_MODE);
return NULL;
}
diff --git a/net/colo-nic.c b/net/colo-nic.c
index f8fc35d..a4719ce 100644
--- a/net/colo-nic.c
+++ b/net/colo-nic.c
@@ -26,6 +26,12 @@ typedef struct nic_device {
} nic_device;
+typedef struct colo_proxy {
+ int sockfd;
+ int index;
+} colo_proxy;
+
+static colo_proxy cp_info = {-1, -1};
QTAILQ_HEAD(, nic_device) nic_devices = QTAILQ_HEAD_INITIALIZER(nic_devices);
static int colo_nic_side = -1;
@@ -93,6 +99,60 @@ static int colo_nic_configure(NetClientState *nc,
return launch_colo_script(argv);
}
+static int configure_one_nic(NetClientState *nc,
+ bool up, int side, int index)
+{
+ struct nic_device *nic;
+
+ assert(nc);
+
+ QTAILQ_FOREACH(nic, &nic_devices, next) {
+ if (nic->nc == nc) {
+ if (!nic->support_colo || !nic->support_colo(nic->nc)
+ || !nic->configure) {
+ return -1;
+ }
+ if (up == nic->is_up) {
+ return 0;
+ }
+
+ if (nic->configure(nic->nc, up, side, index) && up) {
+ return -1;
+ }
+ nic->is_up = up;
+ return 0;
+ }
+ }
+
+ return -1;
+}
+
+static int configure_nic(int side, int index)
+{
+ struct nic_device *nic;
+
+ if (QTAILQ_EMPTY(&nic_devices)) {
+ return -1;
+ }
+
+ QTAILQ_FOREACH(nic, &nic_devices, next) {
+ if (configure_one_nic(nic->nc, 1, side, index)) {
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+static void teardown_nic(int side, int index)
+{
+ struct nic_device *nic;
+
+ QTAILQ_FOREACH(nic, &nic_devices, next) {
+ configure_one_nic(nic->nc, 0, side, index);
+ }
+}
+
void colo_add_nic_devices(NetClientState *nc)
{
struct nic_device *nic = g_malloc0(sizeof(*nic));
@@ -119,9 +179,29 @@ void colo_remove_nic_devices(NetClientState *nc)
QTAILQ_FOREACH_SAFE(nic, &nic_devices, next, next_nic) {
if (nic->nc == nc) {
+ configure_one_nic(nc, 0, colo_nic_side, cp_info.index);
QTAILQ_REMOVE(&nic_devices, nic, next);
g_free(nic);
}
}
colo_nic_side = -1;
}
+
+int colo_proxy_init(int side)
+{
+ int ret = -1;
+
+ ret = configure_nic(side, cp_info.index);
+ if (ret != 0) {
+ error_report("excute colo-proxy-script failed");
+ }
+ colo_nic_side = side;
+ return ret;
+}
+
+void colo_proxy_destroy(int side)
+{
+ teardown_nic(side, cp_info.index);
+ cp_info.index = -1;
+ colo_nic_side = -1;
+}
--
1.7.12.4
- Re: [Qemu-devel] [PATCH RFC v3 17/27] COLO: Add new command parameter 'colo_nicname' 'colo_script' for net, (continued)
[Qemu-devel] [PATCH RFC v3 20/27] COLO NIC : Implement colo nic init/destroy function,
zhanghailiang <=
[Qemu-devel] [PATCH RFC v3 22/27] COLO: Do checkpoint according to the result of net packets comparing, zhanghailiang, 2015/02/11
[Qemu-devel] [PATCH RFC v3 26/27] COLO: Implement shutdown checkpoint, zhanghailiang, 2015/02/11
[Qemu-devel] [PATCH RFC v3 25/27] COLO: Disable qdev hotplug when VM is in COLO mode, zhanghailiang, 2015/02/11
[Qemu-devel] [PATCH RFC v3 24/27] COLO NIC: Implement NIC checkpoint and failover, zhanghailiang, 2015/02/11
[Qemu-devel] [PATCH RFC v3 27/27] COLO: Add block replication into colo process, zhanghailiang, 2015/02/11
[Qemu-devel] [PATCH RFC v3 05/27] migration: Integrate COLO checkpoint process into loadvm, zhanghailiang, 2015/02/11
[Qemu-devel] [PATCH RFC v3 11/27] COLO RAM: Load PVM's dirty page into SVM's RAM cache temporarily, zhanghailiang, 2015/02/11
[Qemu-devel] [PATCH RFC v3 14/27] COLO failover: Introduce a new command to trigger a failover, zhanghailiang, 2015/02/11