|
From: | Zhang Chen |
Subject: | Re: [Qemu-devel] [RFC PATCH v2 05/10] net/colo-proxy: Add colo interface to use proxy |
Date: | Mon, 22 Feb 2016 11:08:06 +0800 |
User-agent: | Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1 |
On 02/20/2016 03:58 AM, Dr. David Alan Gilbert wrote:
* Zhang Chen (address@hidden) wrote:From: zhangchen <address@hidden> Add interface used by migration/colo.c so colo framework can work with proxy Signed-off-by: zhangchen <address@hidden> Signed-off-by: zhanghailiang <address@hidden> --- net/colo-proxy.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/net/colo-proxy.c b/net/colo-proxy.c index f448ee1..ba2bbe7 100644 --- a/net/colo-proxy.c +++ b/net/colo-proxy.c @@ -167,6 +167,11 @@ static int connection_key_equal(const void *opaque1, const void *opaque2) return memcmp(opaque1, opaque2, sizeof(ConnectionKey)) == 0; }+bool colo_proxy_query_checkpoint(void)+{ + return colo_do_checkpoint; +} + static ssize_t colo_proxy_receive_iov(NetFilterState *nf, NetClientState *sender, unsigned flags, @@ -203,6 +208,94 @@ static void colo_proxy_cleanup(NetFilterState *nf) qemu_event_destroy(&s->need_compare_ev); }+static void colo_proxy_notify_checkpoint(void)+{ + trace_colo_proxy("colo_proxy_notify_checkpoint"); + colo_do_checkpoint = true; +} + +static void colo_proxy_start_one(NetFilterState *nf, + void *opaque, Error **errp) +{ + COLOProxyState *s; + int mode, ret; + + if (strcmp(object_get_typename(OBJECT(nf)), TYPE_FILTER_COLO_PROXY)) { + return; + } + + mode = *(int *)opaque; + s = FILTER_COLO_PROXY(nf); + assert(s->colo_mode == mode); + + if (s->colo_mode == COLO_MODE_PRIMARY) { + char thread_name[1024]; + + ret = colo_proxy_connect(s); + if (ret) { + error_setg(errp, "colo proxy connect failed"); + return ; + } + + s->status = COLO_PROXY_RUNNING; + sprintf(thread_name, "proxy compare %s", nf->netdev_id); + qemu_thread_create(&s->thread, thread_name, + colo_proxy_compare_thread, s, + QEMU_THREAD_JOINABLE);Note most OSs have a ~14 character limit on the size of the thread name, otherwise they ignore the request to set the name (and the thread shows up as 'migration'), so I suggest keep it as "proxy:%s". Dave
I will fix it in colo-compare module. Thanks zhangchen
+ } else { + ret = colo_wait_incoming(s); + if (ret) { + error_setg(errp, "colo proxy wait incoming failed"); + return ; + } + s->status = COLO_PROXY_RUNNING; + } +} + +int colo_proxy_start(int mode) +{ + Error *err = NULL; + qemu_foreach_netfilter(colo_proxy_start_one, &mode, &err); + if (err) { + return -1; + } + return 0; +} + +static void colo_proxy_stop_one(NetFilterState *nf, + void *opaque, Error **errp) +{ + COLOProxyState *s; + int mode; + + if (strcmp(object_get_typename(OBJECT(nf)), TYPE_FILTER_COLO_PROXY)) { + return; + } + + s = FILTER_COLO_PROXY(nf); + mode = *(int *)opaque; + assert(s->colo_mode == mode); + + s->status = COLO_PROXY_DONE; + if (s->sockfd >= 0) { + qemu_set_fd_handler(s->sockfd, NULL, NULL, NULL); + closesocket(s->sockfd); + } + if (s->colo_mode == COLO_MODE_PRIMARY) { + colo_proxy_primary_checkpoint(s); + qemu_event_set(&s->need_compare_ev); + qemu_thread_join(&s->thread); + } else { + colo_proxy_secondary_checkpoint(s); + } +} + +void colo_proxy_stop(int mode) +{ + Error *err = NULL; + qemu_foreach_netfilter(colo_proxy_stop_one, &mode, &err); +} + static void colo_proxy_setup(NetFilterState *nf, Error **errp) { COLOProxyState *s = FILTER_COLO_PROXY(nf); -- 1.9.1-- Dr. David Alan Gilbert / address@hidden / Manchester, UK .
-- Thanks zhangchen
[Prev in Thread] | Current Thread | [Next in Thread] |