When COLO mode, we do some init work for nic that will be used for COLO. Cc: Stefan Hajnoczi <stefa...@redhat.com> Cc: Jason Wang <jasow...@redhat.com> Signed-off-by: zhanghailiang <zhang.zhanghaili...@huawei.com> Signed-off-by: Li Zhijian <lizhij...@cn.fujitsu.com> --- include/net/colo-nic.h | 3 +++ net/Makefile.objs | 1 + net/colo-nic.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++ net/net.c | 2 ++ net/tap.c | 12 +++++---- stubs/migration-colo.c | 9 +++++++ 6 files changed, 92 insertions(+), 5 deletions(-) create mode 100644 net/colo-nic.c
diff --git a/include/net/colo-nic.h b/include/net/colo-nic.h index 3075d97..2bbe7bc 100644 --- a/include/net/colo-nic.h +++ b/include/net/colo-nic.h @@ -20,4 +20,7 @@ typedef struct COLONicState { char ifname[128]; /* e.g. tap name */ } COLONicState; +void colo_add_nic_devices(COLONicState *cns); +void colo_remove_nic_devices(COLONicState *cns); + #endif diff --git a/net/Makefile.objs b/net/Makefile.objs index ec19cb3..73f4a81 100644 --- a/net/Makefile.objs +++ b/net/Makefile.objs @@ -13,3 +13,4 @@ common-obj-$(CONFIG_HAIKU) += tap-haiku.o common-obj-$(CONFIG_SLIRP) += slirp.o common-obj-$(CONFIG_VDE) += vde.o common-obj-$(CONFIG_NETMAP) += netmap.o +common-obj-$(CONFIG_COLO) += colo-nic.o diff --git a/net/colo-nic.c b/net/colo-nic.c new file mode 100644 index 0000000..9745817 --- /dev/null +++ b/net/colo-nic.c @@ -0,0 +1,70 @@ +/* + * COarse-grain LOck-stepping Virtual Machines for Non-stop Service (COLO) + * (a.k.a. Fault Tolerance or Continuous Replication) + * + * Copyright (c) 2015 HUAWEI TECHNOLOGIES CO., LTD. + * Copyright (c) 2015 FUJITSU LIMITED + * Copyright (c) 2015 Intel Corporation + * + * This work is licensed under the terms of the GNU GPL, version 2 or + * later. See the COPYING file in the top-level directory. + * + */ +#include "include/migration/migration.h" +#include "migration/migration-colo.h" +#include "net/net.h" +#include "net/colo-nic.h" +#include "qemu/error-report.h" + + +typedef struct nic_device { + COLONicState *cns; + int (*configure)(COLONicState *cns, bool up, int side, int index); + QTAILQ_ENTRY(nic_device) next; + bool is_up; +} nic_device; + + + +QTAILQ_HEAD(, nic_device) nic_devices = QTAILQ_HEAD_INITIALIZER(nic_devices); + +/* +* colo_proxy_script usage +* ./colo_proxy_script master/slave install/uninstall phy_if virt_if index +*/ + +void colo_add_nic_devices(COLONicState *cns) +{ + struct nic_device *nic; + NetClientState *nc = container_of(cns, NetClientState, cns); + + if (nc->info->type == NET_CLIENT_OPTIONS_KIND_HUBPORT || + nc->info->type == NET_CLIENT_OPTIONS_KIND_NIC) { + return; + } + QTAILQ_FOREACH(nic, &nic_devices, next) { + NetClientState *nic_nc = container_of(nic->cns, NetClientState, cns); + if ((nic_nc->peer && nic_nc->peer == nc) || + (nc->peer && nc->peer == nic_nc)) { + return; + } + } + + nic = g_malloc0(sizeof(*nic)); + nic->configure = NULL; + nic->cns = cns; + + QTAILQ_INSERT_TAIL(&nic_devices, nic, next); +} + +void colo_remove_nic_devices(COLONicState *cns) +{ + struct nic_device *nic, *next_nic; + + QTAILQ_FOREACH_SAFE(nic, &nic_devices, next, next_nic) { + if (nic->cns == cns) { + QTAILQ_REMOVE(&nic_devices, nic, next); + g_free(nic); + } + } +} diff --git a/net/net.c b/net/net.c index 25c2ef3..3393ffa 100644 --- a/net/net.c +++ b/net/net.c @@ -279,6 +279,7 @@ static void qemu_net_client_setup(NetClientState *nc, peer->peer = nc; } QTAILQ_INSERT_TAIL(&net_clients, nc, next); + colo_add_nic_devices(&nc->cns); nc->incoming_queue = qemu_new_net_queue(nc); nc->destructor = destructor; @@ -354,6 +355,7 @@ void *qemu_get_nic_opaque(NetClientState *nc) static void qemu_cleanup_net_client(NetClientState *nc) { QTAILQ_REMOVE(&net_clients, nc, next); + colo_remove_nic_devices(&nc->cns); if (nc->info->cleanup) { nc->info->cleanup(nc); diff --git a/net/tap.c b/net/tap.c index c558f79..64e4264 100644 --- a/net/tap.c +++ b/net/tap.c @@ -41,6 +41,7 @@ #include "qemu/error-report.h" #include "net/tap.h" +#include "net/colo-nic.h" #include "net/vhost_net.h" @@ -611,7 +612,8 @@ static void net_init_tap_one(const NetdevTapOptions *tap, NetClientState *peer, const char *model, const char *name, const char *ifname, const char *script, const char *downscript, const char *vhostfdname, - int vnet_hdr, int fd, Error **errp) + int vnet_hdr, int fd, bool setup_colo, + Error **errp) { Error *err = NULL; TAPState *s = net_tap_fd_init(peer, model, name, fd, vnet_hdr); @@ -759,7 +761,7 @@ int net_init_tap(const NetClientOptions *opts, const char *name, net_init_tap_one(tap, peer, "tap", name, NULL, script, downscript, - vhostfdname, vnet_hdr, fd, &err); + vhostfdname, vnet_hdr, fd, true, &err); if (err) { error_propagate(errp, err); return -1; @@ -809,7 +811,7 @@ int net_init_tap(const NetClientOptions *opts, const char *name, net_init_tap_one(tap, peer, "tap", name, ifname, script, downscript, tap->has_vhostfds ? vhost_fds[i] : NULL, - vnet_hdr, fd, &err); + vnet_hdr, fd, false, &err); if (err) { error_propagate(errp, err); return -1; @@ -836,7 +838,7 @@ int net_init_tap(const NetClientOptions *opts, const char *name, net_init_tap_one(tap, peer, "bridge", name, ifname, script, downscript, vhostfdname, - vnet_hdr, fd, &err); + vnet_hdr, fd, false, &err); if (err) { error_propagate(errp, err); close(fd); @@ -881,7 +883,7 @@ int net_init_tap(const NetClientOptions *opts, const char *name, net_init_tap_one(tap, peer, "tap", name, ifname, i >= 1 ? "no" : script, i >= 1 ? "no" : downscript, - vhostfdname, vnet_hdr, fd, &err); + vhostfdname, vnet_hdr, fd, i == 0, &err); if (err) { error_propagate(errp, err); close(fd); diff --git a/stubs/migration-colo.c b/stubs/migration-colo.c index 23ad3aa..ffd7176 100644 --- a/stubs/migration-colo.c +++ b/stubs/migration-colo.c @@ -12,6 +12,7 @@ #include "migration/migration-colo.h" #include "qmp-commands.h" +#include "net/colo-nic.h" bool colo_supported(void) { @@ -37,6 +38,14 @@ void *colo_process_incoming_checkpoints(void *opaque) return NULL; } +void colo_add_nic_devices(COLONicState *cns) +{ +} + +void colo_remove_nic_devices(COLONicState *cns) +{ +} + void qmp_colo_lost_heartbeat(Error **errp) { error_setg(errp, "COLO is not supported, please rerun configure" -- 1.7.12.4