All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH V4 0/8] COLO-Proxy: Make Xen COLO use userspace colo-proxy
@ 2017-03-06  2:59 Zhang Chen
  2017-03-06  2:59 ` [PATCH V4 1/8] COLO-Proxy: Add remus command to open userspace proxy Zhang Chen
                   ` (8 more replies)
  0 siblings, 9 replies; 24+ messages in thread
From: Zhang Chen @ 2017-03-06  2:59 UTC (permalink / raw)
  To: Xen devel, Wei Liu, Ian Jackson
  Cc: Zhang Chen, Li Zhijian, eddie dong, Yang Hongyang, Bian Naimeng

Because of some reason, We no longer support COLO kernel proxy.
So we send this patch set to make Xen use userspace colo-proxy in qemu.

Below is a COLO userspace proxy ascii figure:

 Primary qemu                                                           Secondary qemu
+--------------------------------------------------------------+       +----------------------------------------------------------------+
| +----------------------------------------------------------+ |       |  +-----------------------------------------------------------+ |
| |                                                          | |       |  |                                                           | |
| |                        guest                             | |       |  |                        guest                              | |
| |                                                          | |       |  |                                                           | |
| +-------^--------------------------+-----------------------+ |       |  +---------------------+--------+----------------------------+ |
|         |                          |                         |       |                        ^        |                              |
|         |                          |                         |       |                        |        |                              |
|         |  +------------------------------------------------------+  |                        |        |                              |
|netfilter|  |                       |                         |    |  |   netfilter            |        |                              |
| +----------+ +----------------------------+                  |    |  |  +-----------------------------------------------------------+ |
| |       |  |                       |      |        out       |    |  |  |                     |        |  filter excute order       | |
| |       |  |          +-----------------------------+        |    |  |  |                     |        | +------------------->      | |
| |       |  |          |            |      |         |        |    |  |  |                     |        |   TCP                      | |
| | +-----+--+-+  +-----v----+ +-----v----+ |pri +----+----+sec|    |  |  | +------------+  +---+----+---v+rewriter++  +------------+ | |
| | |          |  |          | |          | |in  |         |in |    |  |  | |            |  |        |              |  |            | | |
| | |  filter  |  |  filter  | |  filter  +------>  colo   <------+ +-------->  filter   +--> adjust |   adjust     +-->   filter   | | |
| | |  mirror  |  |redirector| |redirector| |    | compare |   |  |    |  | | redirector |  | ack    |   seq        |  | redirector | | |
| | |          |  |          | |          | |    |         |   |  |    |  | |            |  |        |              |  |            | | |
| | +----^-----+  +----+-----+ +----------+ |    +---------+   |  |    |  | +------------+  +--------+--------------+  +---+--------+ | |
| |      |   tx        |   rx           rx  |                  |  |    |  |            tx                        all       |  rx      | |
| |      |             |                    |                  |  |    |  +-----------------------------------------------------------+ |
| |      |             +--------------+     |                  |  |    |                                                   |            |
| |      |   filter excute order      |     |                  |  |    |                                                   |            |
| |      |  +---------------->        |     |                  |  +--------------------------------------------------------+            |
| +-----------------------------------------+                  |       |                                                                |
|        |                            |                        |       |                                                                |
+--------------------------------------------------------------+       +----------------------------------------------------------------+
         |guest receive               | guest send
         |                            |
+--------+----------------------------v------------------------+
|                                                              |                          NOTE: filter direction is rx/tx/all
|                         tap                                  |                          rx:receive packets sent to the netdev
|                                                              |                          tx:receive packets sent by the netdev
+--------------------------------------------------------------+

You can know the detail from here:

http://wiki.qemu.org/Features/COLO
https://github.com/qemu/qemu/blob/master/docs/colo-proxy.txt

V4:
   - Because the origin 3/7 has been merged,
     remove it in this series.
   - Add new patch "COLO-Proxy: Add colo-compare notify args"
     to support qemu side patch:
     https://lists.nongnu.org/archive/html/qemu-devel/2017-02/msg07265.html

   - Add colo_userspace_proxy macro as a separate patch.
   - Add some comments about COLO and fix some typo in patch 2/7.
   - Fix some bug and typo in patch 7/7.
   - Rebase codes on upstream Xen.

V3:
   - remove the 'RFC' tag.
   - fix some bug in patch 7/7.
   - fix codestyle.

V2:
   - Address wei's comments, use macro to reuse codes.
   - Do some work on the last patch.
   - Fix some typo.
   - Add LIBXL_HAVE_COLO_USERSPACE_PROXY macro in libxl.h.
   - Some bug fix.

V1: 
   - Initial patch


Zhang Chen (8):
  COLO-Proxy: Add remus command to open userspace proxy
  COLO-Proxy: Setup userspace colo-proxy on primary side
  COLO-Proxy: Setup userspace colo-proxy on secondary side
  COLO-Proxy: Add primary userspace colo proxy start args
  COLO-Proxy: Add secondary userspace colo-proxy start args
  COLO-Proxy: Add colo-compare notify args
  COLO-Proxy: Use socket to get checkpoint event.
  COLO-proxy: Add colo_userspace_proxy macro

 docs/man/xl.pod.1.in             |   5 ++
 tools/libxl/libxl.h              |   6 ++
 tools/libxl/libxl_colo.h         |   7 ++
 tools/libxl/libxl_colo_proxy.c   | 149 +++++++++++++++++++++++++++++++++++++++
 tools/libxl/libxl_colo_restore.c |  19 +++--
 tools/libxl/libxl_colo_save.c    |  18 ++++-
 tools/libxl/libxl_create.c       |   8 ++-
 tools/libxl/libxl_dm.c           | 138 ++++++++++++++++++++++++++++++++++++
 tools/libxl/libxl_nic.c          | 117 ++++++++++++++++++++++++++++++
 tools/libxl/libxl_types.idl      |  68 +++++++++++++++---
 tools/xl/xl.h                    |   1 +
 tools/xl/xl_cmdtable.c           |   3 +-
 tools/xl/xl_migrate.c            |  28 ++++++--
 tools/xl/xl_parse.c              |  97 +++++++++++++++++++++++++
 tools/xl/xl_vmcontrol.c          |   2 +
 15 files changed, 642 insertions(+), 24 deletions(-)

-- 
2.7.4




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [PATCH V4 1/8] COLO-Proxy: Add remus command to open userspace proxy
  2017-03-06  2:59 [PATCH V4 0/8] COLO-Proxy: Make Xen COLO use userspace colo-proxy Zhang Chen
@ 2017-03-06  2:59 ` Zhang Chen
  2017-03-14 11:23   ` Wei Liu
  2017-03-06  2:59 ` [PATCH V4 2/8] COLO-Proxy: Setup userspace colo-proxy on primary side Zhang Chen
                   ` (7 subsequent siblings)
  8 siblings, 1 reply; 24+ messages in thread
From: Zhang Chen @ 2017-03-06  2:59 UTC (permalink / raw)
  To: Xen devel, Wei Liu, Ian Jackson
  Cc: Zhang Chen, Li Zhijian, eddie dong, Yang Hongyang, Bian Naimeng

Add remus '-p' to enable userspace colo proxy(in qemu).

Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
---
 docs/man/xl.pod.1.in          |  5 +++++
 tools/libxl/libxl_colo.h      |  5 +++++
 tools/libxl/libxl_colo_save.c |  2 ++
 tools/libxl/libxl_types.idl   | 17 +++++++++--------
 tools/xl/xl_cmdtable.c        |  3 ++-
 tools/xl/xl_migrate.c         | 13 ++++++++++++-
 6 files changed, 35 insertions(+), 10 deletions(-)

diff --git a/docs/man/xl.pod.1.in b/docs/man/xl.pod.1.in
index 7caed08..78bf884 100644
--- a/docs/man/xl.pod.1.in
+++ b/docs/man/xl.pod.1.in
@@ -563,6 +563,11 @@ Disable disk replication. Requires enabling unsafe mode.
 Enable COLO HA. This conflicts with B<-i> and B<-b>, and memory
 checkpoint compression must be disabled.
 
+=item B<-p>
+
+Use userspace COLO Proxy. This option must be used in conjunction
+with B<-c>.
+
 =back
 
 =item B<pause> I<domain-id>
diff --git a/tools/libxl/libxl_colo.h b/tools/libxl/libxl_colo.h
index 682275c..4746d8c 100644
--- a/tools/libxl/libxl_colo.h
+++ b/tools/libxl/libxl_colo.h
@@ -64,6 +64,11 @@ struct libxl__colo_proxy_state {
 
     int sock_fd;
     int index;
+    /*
+     * Private, True means use userspace colo proxy
+     *          False means use kernel colo proxy.
+     */
+    bool is_userspace_proxy;
 };
 
 struct libxl__colo_save_state {
diff --git a/tools/libxl/libxl_colo_save.c b/tools/libxl/libxl_colo_save.c
index 6277770..eb8336c 100644
--- a/tools/libxl/libxl_colo_save.c
+++ b/tools/libxl/libxl_colo_save.c
@@ -101,6 +101,8 @@ void libxl__colo_save_setup(libxl__egc *egc, libxl__colo_save_state *css)
     css->qdisk_setuped = false;
     css->qdisk_used = false;
     libxl__ev_child_init(&css->child);
+    css->cps.is_userspace_proxy =
+        libxl_defbool_val(dss->remus->userspace_colo_proxy);
 
     if (dss->remus->netbufscript)
         css->colo_proxy_script = libxl__strdup(gc, dss->remus->netbufscript);
diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
index a612d1f..1bd2057 100644
--- a/tools/libxl/libxl_types.idl
+++ b/tools/libxl/libxl_types.idl
@@ -844,14 +844,15 @@ libxl_sched_credit2_params = Struct("sched_credit2_params", [
     ], dispose_fn=None)
 
 libxl_domain_remus_info = Struct("domain_remus_info",[
-    ("interval",     integer),
-    ("allow_unsafe", libxl_defbool),
-    ("blackhole",    libxl_defbool),
-    ("compression",  libxl_defbool),
-    ("netbuf",       libxl_defbool),
-    ("netbufscript", string),
-    ("diskbuf",      libxl_defbool),
-    ("colo",         libxl_defbool)
+    ("interval",             integer),
+    ("allow_unsafe",         libxl_defbool),
+    ("blackhole",            libxl_defbool),
+    ("compression",          libxl_defbool),
+    ("netbuf",               libxl_defbool),
+    ("netbufscript",         string),
+    ("diskbuf",              libxl_defbool),
+    ("colo",                 libxl_defbool),
+    ("userspace_colo_proxy", libxl_defbool)
     ])
 
 libxl_event_type = Enumeration("event_type", [
diff --git a/tools/xl/xl_cmdtable.c b/tools/xl/xl_cmdtable.c
index 1219b33..7d97811 100644
--- a/tools/xl/xl_cmdtable.c
+++ b/tools/xl/xl_cmdtable.c
@@ -506,7 +506,8 @@ struct cmd_spec cmd_table[] = {
       "-n                      Disable network output buffering. Works only in unsafe mode.\n"
       "-d                      Disable disk replication. Works only in unsafe mode.\n"
       "-c                      Enable COLO HA. It is conflict with -i and -b, and memory\n"
-      "                        checkpoint must be disabled"
+      "                        checkpoint must be disabled.\n"
+      "-p                      Use COLO userspace proxy."
     },
 #endif
     { "devd",
diff --git a/tools/xl/xl_migrate.c b/tools/xl/xl_migrate.c
index 28fb823..9a267cc 100644
--- a/tools/xl/xl_migrate.c
+++ b/tools/xl/xl_migrate.c
@@ -609,7 +609,7 @@ int main_remus(int argc, char **argv)
 
     memset(&r_info, 0, sizeof(libxl_domain_remus_info));
 
-    SWITCH_FOREACH_OPT(opt, "Fbundi:s:N:ec", NULL, "remus", 2) {
+    SWITCH_FOREACH_OPT(opt, "Fbundi:s:N:ecp", NULL, "remus", 2) {
     case 'i':
         r_info.interval = atoi(optarg);
         break;
@@ -639,6 +639,9 @@ int main_remus(int argc, char **argv)
         break;
     case 'c':
         libxl_defbool_set(&r_info.colo, true);
+        break;
+    case 'p':
+        libxl_defbool_set(&r_info.userspace_colo_proxy, true);
     }
 
     domid = find_domain(argv[optind]);
@@ -647,9 +650,17 @@ int main_remus(int argc, char **argv)
     /* Defaults */
     libxl_defbool_setdefault(&r_info.blackhole, false);
     libxl_defbool_setdefault(&r_info.colo, false);
+    libxl_defbool_setdefault(&r_info.userspace_colo_proxy, false);
+
     if (!libxl_defbool_val(r_info.colo) && !r_info.interval)
         r_info.interval = 200;
 
+    if (libxl_defbool_val(r_info.userspace_colo_proxy) &&
+        !libxl_defbool_val(r_info.colo)) {
+        fprintf(stderr, "Option -p must be used in conjunction with -c");
+        exit(-1);
+    }
+
     if (libxl_defbool_val(r_info.colo)) {
         if (r_info.interval || libxl_defbool_val(r_info.blackhole) ||
             !libxl_defbool_is_default(r_info.netbuf) ||
-- 
2.7.4




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH V4 2/8] COLO-Proxy: Setup userspace colo-proxy on primary side
  2017-03-06  2:59 [PATCH V4 0/8] COLO-Proxy: Make Xen COLO use userspace colo-proxy Zhang Chen
  2017-03-06  2:59 ` [PATCH V4 1/8] COLO-Proxy: Add remus command to open userspace proxy Zhang Chen
@ 2017-03-06  2:59 ` Zhang Chen
  2017-03-14 11:24   ` Wei Liu
  2017-03-06  2:59 ` [PATCH V4 3/8] COLO-Proxy: Setup userspace colo-proxy on secondary side Zhang Chen
                   ` (6 subsequent siblings)
  8 siblings, 1 reply; 24+ messages in thread
From: Zhang Chen @ 2017-03-06  2:59 UTC (permalink / raw)
  To: Xen devel, Wei Liu, Ian Jackson
  Cc: Zhang Chen, Li Zhijian, eddie dong, Yang Hongyang, Bian Naimeng

In this patch we close kernel COLO-Proxy on primary side.

Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
---
 tools/libxl/libxl_colo_proxy.c | 31 +++++++++++++++++++++++++++++++
 tools/libxl/libxl_colo_save.c  |  9 +++++++--
 2 files changed, 38 insertions(+), 2 deletions(-)

diff --git a/tools/libxl/libxl_colo_proxy.c b/tools/libxl/libxl_colo_proxy.c
index 0983f42..ec76e37 100644
--- a/tools/libxl/libxl_colo_proxy.c
+++ b/tools/libxl/libxl_colo_proxy.c
@@ -152,6 +152,10 @@ int colo_proxy_setup(libxl__colo_proxy_state *cps)
 
     STATE_AO_GC(cps->ao);
 
+    /* If enable userspace proxy mode, we don't need setup kernel proxy */
+    if (cps->is_userspace_proxy)
+        return 0;
+
     skfd = socket(PF_NETLINK, SOCK_RAW, NETLINK_COLO);
     if (skfd < 0) {
         LOGD(ERROR, ao->domid, "can not create a netlink socket: %s", strerror(errno));
@@ -222,6 +226,13 @@ out:
 
 void colo_proxy_teardown(libxl__colo_proxy_state *cps)
 {
+    /*
+     * If enable userspace proxy mode,
+     * we don't need teardown kernel proxy
+     */
+    if (cps->is_userspace_proxy)
+        return;
+
     if (cps->sock_fd >= 0) {
         close(cps->sock_fd);
         cps->sock_fd = -1;
@@ -232,6 +243,13 @@ void colo_proxy_teardown(libxl__colo_proxy_state *cps)
 
 void colo_proxy_preresume(libxl__colo_proxy_state *cps)
 {
+    /*
+     * If enable userspace proxy mode,
+     * we don't need preresume kernel proxy
+     */
+    if (cps->is_userspace_proxy)
+        return;
+
     colo_proxy_send(cps, NULL, 0, COLO_CHECKPOINT);
     /* TODO: need to handle if the call fails... */
 }
@@ -262,6 +280,19 @@ int colo_proxy_checkpoint(libxl__colo_proxy_state *cps,
 
     STATE_AO_GC(cps->ao);
 
+    /*
+     * Enable userspace proxy to periodical checkpoint mode,
+     * sleeping temporarily for colo userspace proxy mode.
+     * then we will use socket recv instead of this usleep.
+     * In other words, we use socket communicate with Qemu
+     * Proxy part(colo-compare), for example, notify checkpoint
+     * event.
+     */
+    if (cps->is_userspace_proxy) {
+        usleep(timeout_us);
+        return 0;
+    }
+
     size = colo_proxy_recv(cps, &buff, timeout_us);
 
     /* timeout, return no checkpoint message. */
diff --git a/tools/libxl/libxl_colo_save.c b/tools/libxl/libxl_colo_save.c
index eb8336c..91e3fce 100644
--- a/tools/libxl/libxl_colo_save.c
+++ b/tools/libxl/libxl_colo_save.c
@@ -110,8 +110,13 @@ void libxl__colo_save_setup(libxl__egc *egc, libxl__colo_save_state *css)
         css->colo_proxy_script = GCSPRINTF("%s/colo-proxy-setup",
                                            libxl__xen_script_dir_path());
 
-    cds->device_kind_flags = (1 << LIBXL__DEVICE_KIND_VIF) |
-                             (1 << LIBXL__DEVICE_KIND_VBD);
+    /* If enable userspace proxy mode, we don't need VIF */
+    if (css->cps.is_userspace_proxy)
+        cds->device_kind_flags = (1 << LIBXL__DEVICE_KIND_VBD);
+    else
+        cds->device_kind_flags = (1 << LIBXL__DEVICE_KIND_VIF) |
+                                 (1 << LIBXL__DEVICE_KIND_VBD);
+
     cds->ops = colo_ops;
     cds->callback = colo_save_setup_done;
     cds->ao = ao;
-- 
2.7.4




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH V4 3/8] COLO-Proxy: Setup userspace colo-proxy on secondary side
  2017-03-06  2:59 [PATCH V4 0/8] COLO-Proxy: Make Xen COLO use userspace colo-proxy Zhang Chen
  2017-03-06  2:59 ` [PATCH V4 1/8] COLO-Proxy: Add remus command to open userspace proxy Zhang Chen
  2017-03-06  2:59 ` [PATCH V4 2/8] COLO-Proxy: Setup userspace colo-proxy on primary side Zhang Chen
@ 2017-03-06  2:59 ` Zhang Chen
  2017-03-14 11:24   ` Wei Liu
  2017-03-06  2:59 ` [PATCH V4 4/8] COLO-Proxy: Add primary userspace colo proxy start args Zhang Chen
                   ` (5 subsequent siblings)
  8 siblings, 1 reply; 24+ messages in thread
From: Zhang Chen @ 2017-03-06  2:59 UTC (permalink / raw)
  To: Xen devel, Wei Liu, Ian Jackson
  Cc: Zhang Chen, Li Zhijian, eddie dong, Yang Hongyang, Bian Naimeng

In this patch we add a function to close COLO kernel Proxy on secondary side.

Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
---
 tools/libxl/libxl_colo_restore.c |  8 ++++++--
 tools/libxl/libxl_create.c       |  8 ++++++--
 tools/libxl/libxl_types.idl      |  1 +
 tools/xl/xl.h                    |  1 +
 tools/xl/xl_migrate.c            | 15 ++++++++++++---
 tools/xl/xl_vmcontrol.c          |  2 ++
 6 files changed, 28 insertions(+), 7 deletions(-)

diff --git a/tools/libxl/libxl_colo_restore.c b/tools/libxl/libxl_colo_restore.c
index 6a96328..c6d239a 100644
--- a/tools/libxl/libxl_colo_restore.c
+++ b/tools/libxl/libxl_colo_restore.c
@@ -774,8 +774,12 @@ static void colo_setup_checkpoint_devices(libxl__egc *egc,
 
     STATE_AO_GC(crs->ao);
 
-    cds->device_kind_flags = (1 << LIBXL__DEVICE_KIND_VIF) |
-                             (1 << LIBXL__DEVICE_KIND_VBD);
+    if (crs->cps.is_userspace_proxy)
+        cds->device_kind_flags = (1 << LIBXL__DEVICE_KIND_VBD);
+    else
+        cds->device_kind_flags = (1 << LIBXL__DEVICE_KIND_VIF) |
+                                 (1 << LIBXL__DEVICE_KIND_VBD);
+
     cds->callback = colo_restore_setup_cds_done;
     cds->ao = ao;
     cds->domid = crs->domid;
diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
index e741b9a..409945a 100644
--- a/tools/libxl/libxl_create.c
+++ b/tools/libxl/libxl_create.c
@@ -1633,11 +1633,15 @@ static int do_domain_create(libxl_ctx *ctx, libxl_domain_config *d_config,
     cdcs->dcs.domid_soft_reset = INVALID_DOMID;
 
     if (cdcs->dcs.restore_params.checkpointed_stream ==
-        LIBXL_CHECKPOINTED_STREAM_COLO)
+        LIBXL_CHECKPOINTED_STREAM_COLO) {
         cdcs->dcs.colo_proxy_script =
             cdcs->dcs.restore_params.colo_proxy_script;
-    else
+        cdcs->dcs.crs.cps.is_userspace_proxy =
+            libxl_defbool_val(cdcs->dcs.restore_params.userspace_colo_proxy);
+    } else {
         cdcs->dcs.colo_proxy_script = NULL;
+        cdcs->dcs.crs.cps.is_userspace_proxy = false;
+    }
 
     libxl__ao_progress_gethow(&cdcs->dcs.aop_console_how, aop_console_how);
     cdcs->domid_out = domid;
diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
index 1bd2057..89c2c9d 100644
--- a/tools/libxl/libxl_types.idl
+++ b/tools/libxl/libxl_types.idl
@@ -390,6 +390,7 @@ libxl_domain_restore_params = Struct("domain_restore_params", [
     ("checkpointed_stream", integer),
     ("stream_version", uint32, {'init_val': '1'}),
     ("colo_proxy_script", string),
+    ("userspace_colo_proxy", libxl_defbool),
     ])
 
 libxl_sched_params = Struct("sched_params",[
diff --git a/tools/xl/xl.h b/tools/xl/xl.h
index 65b89ce..dc35ec2 100644
--- a/tools/xl/xl.h
+++ b/tools/xl/xl.h
@@ -45,6 +45,7 @@ struct domain_create {
     char *extra_config; /* extra config string */
     const char *restore_file;
     char *colo_proxy_script;
+    bool userspace_colo_proxy;
     int migrate_fd; /* -1 means none */
     int send_back_fd; /* -1 means none */
     char **migration_domname_r; /* from malloc */
diff --git a/tools/xl/xl_migrate.c b/tools/xl/xl_migrate.c
index 9a267cc..65a5a46 100644
--- a/tools/xl/xl_migrate.c
+++ b/tools/xl/xl_migrate.c
@@ -321,7 +321,8 @@ static void migrate_receive(int debug, int daemonize, int monitor,
                             int pause_after_migration,
                             int send_fd, int recv_fd,
                             libxl_checkpointed_stream checkpointed,
-                            char *colo_proxy_script)
+                            char *colo_proxy_script,
+                            bool userspace_colo_proxy)
 {
     uint32_t domid;
     int rc, rc2;
@@ -349,6 +350,7 @@ static void migrate_receive(int debug, int daemonize, int monitor,
     dom_info.migration_domname_r = &migration_domname;
     dom_info.checkpointed_stream = checkpointed;
     dom_info.colo_proxy_script = colo_proxy_script;
+    dom_info.userspace_colo_proxy = userspace_colo_proxy;
 
     rc = create_domain(&dom_info);
     if (rc < 0) {
@@ -480,11 +482,13 @@ int main_migrate_receive(int argc, char **argv)
     int debug = 0, daemonize = 1, monitor = 1, pause_after_migration = 0;
     libxl_checkpointed_stream checkpointed = LIBXL_CHECKPOINTED_STREAM_NONE;
     int opt;
+    bool userspace_colo_proxy = false;
     char *script = NULL;
     static struct option opts[] = {
         {"colo", 0, 0, 0x100},
         /* It is a shame that the management code for disk is not here. */
         {"coloft-script", 1, 0, 0x200},
+        {"userspace-colo-proxy", 0, 0, 0x300},
         COMMON_LONG_OPTS
     };
 
@@ -508,6 +512,9 @@ int main_migrate_receive(int argc, char **argv)
     case 0x200:
         script = optarg;
         break;
+    case 0x300:
+        userspace_colo_proxy = true;
+        break;
     case 'p':
         pause_after_migration = 1;
         break;
@@ -519,7 +526,7 @@ int main_migrate_receive(int argc, char **argv)
     }
     migrate_receive(debug, daemonize, monitor, pause_after_migration,
                     STDOUT_FILENO, STDIN_FILENO,
-                    checkpointed, script);
+                    checkpointed, script, userspace_colo_proxy);
 
     return EXIT_SUCCESS;
 }
@@ -700,11 +707,13 @@ int main_remus(int argc, char **argv)
                           "-r",
                           daemonize ? "" : " -e");
             } else {
-                xasprintf(&rune, "exec %s %s xl migrate-receive %s %s %s %s",
+                xasprintf(&rune, "exec %s %s xl migrate-receive %s %s %s %s %s",
                           ssh_command, host,
                           "--colo",
                           r_info.netbufscript ? "--coloft-script" : "",
                           r_info.netbufscript ? r_info.netbufscript : "",
+                          libxl_defbool_val(r_info.userspace_colo_proxy) ?
+                          "--userspace-colo-proxy" : "",
                           daemonize ? "" : " -e");
             }
         }
diff --git a/tools/xl/xl_vmcontrol.c b/tools/xl/xl_vmcontrol.c
index 9b9d55c..e643878 100644
--- a/tools/xl/xl_vmcontrol.c
+++ b/tools/xl/xl_vmcontrol.c
@@ -881,6 +881,8 @@ start:
         params.stream_version =
             (hdr.mandatory_flags & XL_MANDATORY_FLAG_STREAMv2) ? 2 : 1;
         params.colo_proxy_script = dom_info->colo_proxy_script;
+        libxl_defbool_set(&params.userspace_colo_proxy,
+                          dom_info->userspace_colo_proxy);
 
         ret = libxl_domain_create_restore(ctx, &d_config,
                                           &domid, restore_fd,
-- 
2.7.4




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH V4 4/8] COLO-Proxy: Add primary userspace colo proxy start args
  2017-03-06  2:59 [PATCH V4 0/8] COLO-Proxy: Make Xen COLO use userspace colo-proxy Zhang Chen
                   ` (2 preceding siblings ...)
  2017-03-06  2:59 ` [PATCH V4 3/8] COLO-Proxy: Setup userspace colo-proxy on secondary side Zhang Chen
@ 2017-03-06  2:59 ` Zhang Chen
  2017-03-14 11:24   ` Wei Liu
  2017-03-06  2:59 ` [PATCH V4 5/8] COLO-Proxy: Add secondary userspace colo-proxy " Zhang Chen
                   ` (4 subsequent siblings)
  8 siblings, 1 reply; 24+ messages in thread
From: Zhang Chen @ 2017-03-06  2:59 UTC (permalink / raw)
  To: Xen devel, Wei Liu, Ian Jackson
  Cc: Zhang Chen, Li Zhijian, eddie dong, Yang Hongyang, Bian Naimeng

Qemu need this args to start userspace colo-proxy.

Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
---
 tools/libxl/libxl_dm.c      | 98 +++++++++++++++++++++++++++++++++++++++++++++
 tools/libxl/libxl_nic.c     | 78 ++++++++++++++++++++++++++++++++++++
 tools/libxl/libxl_types.idl | 31 +++++++++++++-
 tools/xl/xl_parse.c         | 58 +++++++++++++++++++++++++++
 4 files changed, 264 insertions(+), 1 deletion(-)

diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
index 281058d..abd4edd 100644
--- a/tools/libxl/libxl_dm.c
+++ b/tools/libxl/libxl_dm.c
@@ -1244,7 +1244,105 @@ static int libxl__build_device_model_args_new(libxl__gc *gc,
                                            nics[i].devid, ifname,
                                            libxl_tapif_script(gc),
                                            libxl_tapif_script(gc)));
+
+                /* Userspace COLO Proxy need this */
+#define APPEND_COLO_SOCK_SERVER(sock_id, sock_ip, sock_port) ({             \
+    if (nics[i].colo_##sock_id &&                                           \
+        nics[i].colo_##sock_ip &&                                           \
+        nics[i].colo_##sock_port) {                                         \
+        flexarray_append(dm_args, "-chardev");                              \
+        flexarray_append(dm_args,                                           \
+            GCSPRINTF("socket,id=%s,host=%s,port=%s,server,nowait",         \
+                      nics[i].colo_##sock_id,                               \
+                      nics[i].colo_##sock_ip,                               \
+                      nics[i].colo_##sock_port));                           \
+        }                                                                   \
+})
+
+#define APPEND_COLO_SOCK_CLIENT(sock_id, sock_ip, sock_port) ({             \
+    if (nics[i].colo_##sock_id &&                                           \
+        nics[i].colo_##sock_ip &&                                           \
+        nics[i].colo_##sock_port) {                                         \
+        flexarray_append(dm_args, "-chardev");                              \
+        flexarray_append(dm_args,                                           \
+            GCSPRINTF("socket,id=%s,host=%s,port=%s",                       \
+                      nics[i].colo_##sock_id,                               \
+                      nics[i].colo_##sock_ip,                               \
+                      nics[i].colo_##sock_port));                           \
+        }                                                                   \
+})
+
+                if (state->saved_state) {
+                    /* secondary colo run */
+                } else {
+                    /* primary colo run */
+
+                    APPEND_COLO_SOCK_SERVER(sock_mirror_id,
+                                            sock_mirror_ip,
+                                            sock_mirror_port);
+
+                    APPEND_COLO_SOCK_SERVER(sock_compare_pri_in_id,
+                                            sock_compare_pri_in_ip,
+                                            sock_compare_pri_in_port);
+
+                    APPEND_COLO_SOCK_SERVER(sock_compare_sec_in_id,
+                                            sock_compare_sec_in_ip,
+                                            sock_compare_sec_in_port);
+
+                    APPEND_COLO_SOCK_SERVER(sock_redirector0_id,
+                                            sock_redirector0_ip,
+                                            sock_redirector0_port);
+
+                    APPEND_COLO_SOCK_CLIENT(sock_redirector1_id,
+                                            sock_redirector1_ip,
+                                            sock_redirector1_port);
+
+                    APPEND_COLO_SOCK_CLIENT(sock_redirector2_id,
+                                            sock_redirector2_ip,
+                                            sock_redirector2_port);
+
+                    if (nics[i].colo_filter_mirror_queue &&
+                        nics[i].colo_filter_mirror_outdev) {
+                        flexarray_append(dm_args, "-object");
+                        flexarray_append(dm_args,
+                           GCSPRINTF("filter-mirror,id=m1,netdev=net%d,queue=%s,outdev=%s",
+                                     nics[i].devid,
+                                     nics[i].colo_filter_mirror_queue,
+                                     nics[i].colo_filter_mirror_outdev));
+                    }
+                    if (nics[i].colo_filter_redirector0_queue &&
+                        nics[i].colo_filter_redirector0_indev) {
+                        flexarray_append(dm_args, "-object");
+                        flexarray_append(dm_args,
+                           GCSPRINTF("filter-redirector,id=r1,netdev=net%d,queue=%s,indev=%s",
+                                     nics[i].devid,
+                                     nics[i].colo_filter_redirector0_queue,
+                                     nics[i].colo_filter_redirector0_indev));
+                    }
+                    if (nics[i].colo_filter_redirector1_queue &&
+                        nics[i].colo_filter_redirector1_outdev) {
+                        flexarray_append(dm_args, "-object");
+                        flexarray_append(dm_args,
+                          GCSPRINTF("filter-redirector,id=r2,netdev=net%d,queue=%s,outdev=%s",
+                                     nics[i].devid,
+                                     nics[i].colo_filter_redirector1_queue,
+                                     nics[i].colo_filter_redirector1_outdev));
+                    }
+                    if (nics[i].colo_compare_pri_in &&
+                        nics[i].colo_compare_sec_in &&
+                        nics[i].colo_compare_out) {
+                        flexarray_append(dm_args, "-object");
+                        flexarray_append(dm_args,
+                           GCSPRINTF("colo-compare,id=c1,primary_in=%s,secondary_in=%s,outdev=%s",
+                                     nics[i].colo_compare_pri_in,
+                                     nics[i].colo_compare_sec_in,
+                                     nics[i].colo_compare_out));
+                    }
+                }
                 ioemu_nics++;
+
+#undef APPEND_COLO_SOCK_SERVER
+#undef APPEND_COLO_SOCK_CLIENT
             }
         }
         /* If we have no emulated nics, tell qemu not to create any */
diff --git a/tools/libxl/libxl_nic.c b/tools/libxl/libxl_nic.c
index 61b55ca..7c57bcf 100644
--- a/tools/libxl/libxl_nic.c
+++ b/tools/libxl/libxl_nic.c
@@ -196,6 +196,45 @@ static void libxl__device_nic_add(libxl__egc *egc, uint32_t domid,
         flexarray_append(back, nic->coloft_forwarddev);
     }
 
+#define MAYBE_ADD_COLO_ARGS(arg) ({                                       \
+    if (nic->colo_##arg) {                                                \
+        flexarray_append(back, "colo_"#arg);                              \
+        flexarray_append(back, nic->colo_##arg);                          \
+    }                                                                     \
+})
+
+    MAYBE_ADD_COLO_ARGS(sock_mirror_id);
+    MAYBE_ADD_COLO_ARGS(sock_mirror_ip);
+    MAYBE_ADD_COLO_ARGS(sock_mirror_port);
+    MAYBE_ADD_COLO_ARGS(sock_compare_pri_in_id);
+    MAYBE_ADD_COLO_ARGS(sock_compare_pri_in_ip);
+    MAYBE_ADD_COLO_ARGS(sock_compare_pri_in_port);
+    MAYBE_ADD_COLO_ARGS(sock_compare_sec_in_id);
+    MAYBE_ADD_COLO_ARGS(sock_compare_sec_in_ip);
+    MAYBE_ADD_COLO_ARGS(sock_compare_sec_in_port);
+    MAYBE_ADD_COLO_ARGS(sock_redirector0_id);
+    MAYBE_ADD_COLO_ARGS(sock_redirector0_ip);
+    MAYBE_ADD_COLO_ARGS(sock_redirector0_port);
+    MAYBE_ADD_COLO_ARGS(sock_redirector1_id);
+    MAYBE_ADD_COLO_ARGS(sock_redirector1_ip);
+    MAYBE_ADD_COLO_ARGS(sock_redirector1_port);
+    MAYBE_ADD_COLO_ARGS(sock_redirector2_id);
+    MAYBE_ADD_COLO_ARGS(sock_redirector2_ip);
+    MAYBE_ADD_COLO_ARGS(sock_redirector2_port);
+    MAYBE_ADD_COLO_ARGS(filter_mirror_queue);
+    MAYBE_ADD_COLO_ARGS(filter_mirror_outdev);
+    MAYBE_ADD_COLO_ARGS(filter_redirector0_queue);
+    MAYBE_ADD_COLO_ARGS(filter_redirector0_indev);
+    MAYBE_ADD_COLO_ARGS(filter_redirector0_outdev);
+    MAYBE_ADD_COLO_ARGS(filter_redirector1_queue);
+    MAYBE_ADD_COLO_ARGS(filter_redirector1_indev);
+    MAYBE_ADD_COLO_ARGS(filter_redirector1_outdev);
+    MAYBE_ADD_COLO_ARGS(compare_pri_in);
+    MAYBE_ADD_COLO_ARGS(compare_sec_in);
+    MAYBE_ADD_COLO_ARGS(compare_out);
+
+#undef MAYBE_ADD_COLO_ARGS
+
     flexarray_append(back, "mac");
     flexarray_append(back,GCSPRINTF(LIBXL_MAC_FMT, LIBXL_MAC_BYTES(nic->mac)));
     if (nic->ip) {
@@ -349,6 +388,45 @@ static int libxl__device_nic_from_xenstore(libxl__gc *gc,
                                 (const char **)(&nic->coloft_forwarddev));
     if (rc) goto out;
 
+#define CHECK_COLO_ARGS(arg) ({                                           \
+    rc = libxl__xs_read_checked(NOGC, XBT_NULL,                           \
+                                GCSPRINTF("%s/colo_"#arg, libxl_path),    \
+                                (const char **)(&nic->colo_##arg));       \
+    if (rc) goto out;                                                     \
+})
+
+    CHECK_COLO_ARGS(sock_mirror_id);
+    CHECK_COLO_ARGS(sock_mirror_ip);
+    CHECK_COLO_ARGS(sock_mirror_port);
+    CHECK_COLO_ARGS(sock_compare_pri_in_id);
+    CHECK_COLO_ARGS(sock_compare_pri_in_ip);
+    CHECK_COLO_ARGS(sock_compare_pri_in_port);
+    CHECK_COLO_ARGS(sock_compare_sec_in_id);
+    CHECK_COLO_ARGS(sock_compare_sec_in_ip);
+    CHECK_COLO_ARGS(sock_compare_sec_in_port);
+    CHECK_COLO_ARGS(sock_redirector0_id);
+    CHECK_COLO_ARGS(sock_redirector0_ip);
+    CHECK_COLO_ARGS(sock_redirector0_port);
+    CHECK_COLO_ARGS(sock_redirector1_id);
+    CHECK_COLO_ARGS(sock_redirector1_ip);
+    CHECK_COLO_ARGS(sock_redirector1_port);
+    CHECK_COLO_ARGS(sock_redirector2_id);
+    CHECK_COLO_ARGS(sock_redirector2_ip);
+    CHECK_COLO_ARGS(sock_redirector2_port);
+    CHECK_COLO_ARGS(filter_mirror_queue);
+    CHECK_COLO_ARGS(filter_mirror_outdev);
+    CHECK_COLO_ARGS(filter_redirector0_queue);
+    CHECK_COLO_ARGS(filter_redirector0_indev);
+    CHECK_COLO_ARGS(filter_redirector0_outdev);
+    CHECK_COLO_ARGS(filter_redirector1_queue);
+    CHECK_COLO_ARGS(filter_redirector1_indev);
+    CHECK_COLO_ARGS(filter_redirector1_outdev);
+    CHECK_COLO_ARGS(compare_pri_in);
+    CHECK_COLO_ARGS(compare_sec_in);
+    CHECK_COLO_ARGS(compare_out);
+
+#undef CHECK_COLO_ARGS
+
     /* vif_ioemu nics use the same xenstore entries as vif interfaces */
     rc = libxl__xs_read_checked(gc, XBT_NULL,
                                 GCSPRINTF("%s/type", libxl_path), &tmp);
diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
index 89c2c9d..07ce345 100644
--- a/tools/libxl/libxl_types.idl
+++ b/tools/libxl/libxl_types.idl
@@ -629,7 +629,36 @@ libxl_device_nic = Struct("device_nic", [
     ("gatewaydev", string),
     # Note that the COLO configuration settings should be considered unstable.
     # They may change incompatibly in future versions of Xen.
-    ("coloft_forwarddev", string)
+    ("coloft_forwarddev", string),
+    ("colo_sock_mirror_id", string),
+    ("colo_sock_mirror_ip", string),
+    ("colo_sock_mirror_port", string),
+    ("colo_sock_compare_pri_in_id", string),
+    ("colo_sock_compare_pri_in_ip", string),
+    ("colo_sock_compare_pri_in_port", string),
+    ("colo_sock_compare_sec_in_id", string),
+    ("colo_sock_compare_sec_in_ip", string),
+    ("colo_sock_compare_sec_in_port", string),
+    ("colo_sock_redirector0_id", string),
+    ("colo_sock_redirector0_ip", string),
+    ("colo_sock_redirector0_port", string),
+    ("colo_sock_redirector1_id", string),
+    ("colo_sock_redirector1_ip", string),
+    ("colo_sock_redirector1_port", string),
+    ("colo_sock_redirector2_id", string),
+    ("colo_sock_redirector2_ip", string),
+    ("colo_sock_redirector2_port", string),
+    ("colo_filter_mirror_queue", string),
+    ("colo_filter_mirror_outdev", string),
+    ("colo_filter_redirector0_queue", string),
+    ("colo_filter_redirector0_indev", string),
+    ("colo_filter_redirector0_outdev", string),
+    ("colo_filter_redirector1_queue", string),
+    ("colo_filter_redirector1_indev", string),
+    ("colo_filter_redirector1_outdev", string),
+    ("colo_compare_pri_in", string),
+    ("colo_compare_sec_in", string),
+    ("colo_compare_out", string)
     ])
 
 libxl_device_pci = Struct("device_pci", [
diff --git a/tools/xl/xl_parse.c b/tools/xl/xl_parse.c
index 1ef0c27..88ef1c6 100644
--- a/tools/xl/xl_parse.c
+++ b/tools/xl/xl_parse.c
@@ -458,6 +458,64 @@ int parse_nic_config(libxl_device_nic *nic, XLU_Config **config, char *token)
         parse_vif_rate(config, oparg, nic);
     } else if (MATCH_OPTION("forwarddev", token, oparg)) {
         replace_string(&nic->coloft_forwarddev, oparg);
+    } else if (MATCH_OPTION("colo_sock_mirror_id", token, oparg)) {
+        replace_string(&nic->colo_sock_mirror_id, oparg);
+    } else if (MATCH_OPTION("colo_sock_mirror_ip", token, oparg)) {
+        replace_string(&nic->colo_sock_mirror_ip, oparg);
+    } else if (MATCH_OPTION("colo_sock_mirror_port", token, oparg)) {
+        replace_string(&nic->colo_sock_mirror_port, oparg);
+    } else if (MATCH_OPTION("colo_sock_compare_sec_in_id", token, oparg)) {
+        replace_string(&nic->colo_sock_compare_sec_in_id, oparg);
+    } else if (MATCH_OPTION("colo_sock_compare_sec_in_ip", token, oparg)) {
+        replace_string(&nic->colo_sock_compare_sec_in_ip, oparg);
+    } else if (MATCH_OPTION("colo_sock_compare_sec_in_port", token, oparg)) {
+        replace_string(&nic->colo_sock_compare_sec_in_port, oparg);
+    } else if (MATCH_OPTION("colo_sock_redirector0_id", token, oparg)) {
+        replace_string(&nic->colo_sock_redirector0_id, oparg);
+    } else if (MATCH_OPTION("colo_sock_redirector0_ip", token, oparg)) {
+        replace_string(&nic->colo_sock_redirector0_ip, oparg);
+    } else if (MATCH_OPTION("colo_sock_redirector0_port", token, oparg)) {
+        replace_string(&nic->colo_sock_redirector0_port, oparg);
+    } else if (MATCH_OPTION("colo_sock_redirector1_id", token, oparg)) {
+        replace_string(&nic->colo_sock_redirector1_id, oparg);
+    } else if (MATCH_OPTION("colo_sock_redirector1_ip", token, oparg)) {
+        replace_string(&nic->colo_sock_redirector1_ip, oparg);
+    } else if (MATCH_OPTION("colo_sock_redirector1_port", token, oparg)) {
+        replace_string(&nic->colo_sock_redirector1_port, oparg);
+    } else if (MATCH_OPTION("colo_sock_redirector2_id", token, oparg)) {
+        replace_string(&nic->colo_sock_redirector2_id, oparg);
+    } else if (MATCH_OPTION("colo_sock_redirector2_ip", token, oparg)) {
+        replace_string(&nic->colo_sock_redirector2_ip, oparg);
+    } else if (MATCH_OPTION("colo_sock_redirector2_port", token, oparg)) {
+        replace_string(&nic->colo_sock_redirector2_port, oparg);
+    } else if (MATCH_OPTION("colo_sock_compare_pri_in_id", token, oparg)) {
+        replace_string(&nic->colo_sock_compare_pri_in_id, oparg);
+    } else if (MATCH_OPTION("colo_sock_compare_pri_in_ip", token, oparg)) {
+        replace_string(&nic->colo_sock_compare_pri_in_ip, oparg);
+    } else if (MATCH_OPTION("colo_sock_compare_pri_in_port", token, oparg)) {
+        replace_string(&nic->colo_sock_compare_pri_in_port, oparg);
+    } else if (MATCH_OPTION("colo_filter_mirror_queue", token, oparg)) {
+        replace_string(&nic->colo_filter_mirror_queue, oparg);
+    } else if (MATCH_OPTION("colo_filter_mirror_outdev", token, oparg)) {
+        replace_string(&nic->colo_filter_mirror_outdev, oparg);
+    } else if (MATCH_OPTION("colo_filter_redirector0_queue", token, oparg)) {
+        replace_string(&nic->colo_filter_redirector0_queue, oparg);
+    } else if (MATCH_OPTION("colo_filter_redirector0_indev", token, oparg)) {
+        replace_string(&nic->colo_filter_redirector0_indev, oparg);
+    } else if (MATCH_OPTION("colo_filter_redirector0_outdev", token, oparg)) {
+        replace_string(&nic->colo_filter_redirector0_outdev, oparg);
+    } else if (MATCH_OPTION("colo_filter_redirector1_queue", token, oparg)) {
+        replace_string(&nic->colo_filter_redirector1_queue, oparg);
+    } else if (MATCH_OPTION("colo_filter_redirector1_indev", token, oparg)) {
+        replace_string(&nic->colo_filter_redirector1_indev, oparg);
+    } else if (MATCH_OPTION("colo_filter_redirector1_outdev", token, oparg)) {
+        replace_string(&nic->colo_filter_redirector1_outdev, oparg);
+    } else if (MATCH_OPTION("colo_compare_pri_in", token, oparg)) {
+        replace_string(&nic->colo_compare_pri_in, oparg);
+    } else if (MATCH_OPTION("colo_compare_sec_in", token, oparg)) {
+        replace_string(&nic->colo_compare_sec_in, oparg);
+    } else if (MATCH_OPTION("colo_compare_out", token, oparg)) {
+        replace_string(&nic->colo_compare_out, oparg);
     } else if (MATCH_OPTION("accel", token, oparg)) {
         fprintf(stderr, "the accel parameter for vifs is currently not supported\n");
     } else if (MATCH_OPTION("devid", token, oparg)) {
-- 
2.7.4




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH V4 5/8] COLO-Proxy: Add secondary userspace colo-proxy start args
  2017-03-06  2:59 [PATCH V4 0/8] COLO-Proxy: Make Xen COLO use userspace colo-proxy Zhang Chen
                   ` (3 preceding siblings ...)
  2017-03-06  2:59 ` [PATCH V4 4/8] COLO-Proxy: Add primary userspace colo proxy start args Zhang Chen
@ 2017-03-06  2:59 ` Zhang Chen
  2017-03-14 11:24   ` Wei Liu
  2017-03-06  2:59 ` [PATCH V4 6/8] COLO-Proxy: Add colo-compare notify args Zhang Chen
                   ` (3 subsequent siblings)
  8 siblings, 1 reply; 24+ messages in thread
From: Zhang Chen @ 2017-03-06  2:59 UTC (permalink / raw)
  To: Xen devel, Wei Liu, Ian Jackson
  Cc: Zhang Chen, Li Zhijian, eddie dong, Yang Hongyang, Bian Naimeng

Qemu need this args to start userspace colo-proxy.

Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
---
 tools/libxl/libxl_dm.c      | 34 ++++++++++++++++++++++++++++++++++
 tools/libxl/libxl_nic.c     | 27 +++++++++++++++++++++++++++
 tools/libxl/libxl_types.idl | 15 ++++++++++++++-
 tools/xl/xl_parse.c         | 27 +++++++++++++++++++++++++++
 4 files changed, 102 insertions(+), 1 deletion(-)

diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
index abd4edd..0fabd64 100644
--- a/tools/libxl/libxl_dm.c
+++ b/tools/libxl/libxl_dm.c
@@ -1274,6 +1274,40 @@ static int libxl__build_device_model_args_new(libxl__gc *gc,
 
                 if (state->saved_state) {
                     /* secondary colo run */
+
+                    APPEND_COLO_SOCK_CLIENT(sock_sec_redirector0_id,
+                                            sock_sec_redirector0_ip,
+                                            sock_sec_redirector0_port);
+
+                    APPEND_COLO_SOCK_CLIENT(sock_sec_redirector1_id,
+                                            sock_sec_redirector1_ip,
+                                            sock_sec_redirector1_port);
+
+                    if (nics[i].colo_filter_sec_redirector0_queue &&
+                        nics[i].colo_filter_sec_redirector0_indev) {
+                        flexarray_append(dm_args, "-object");
+                        flexarray_append(dm_args,
+                           GCSPRINTF("filter-redirector,id=rs1,netdev=net%d,queue=%s,indev=%s",
+                                     nics[i].devid,
+                                     nics[i].colo_filter_sec_redirector0_queue,
+                                     nics[i].colo_filter_sec_redirector0_indev));
+                    }
+                    if (nics[i].colo_filter_sec_redirector1_queue &&
+                        nics[i].colo_filter_sec_redirector1_indev) {
+                        flexarray_append(dm_args, "-object");
+                        flexarray_append(dm_args,
+                           GCSPRINTF("filter-redirector,id=rs2,netdev=net%d,queue=%s,outdev=%s",
+                                     nics[i].devid,
+                                     nics[i].colo_filter_sec_redirector1_queue,
+                                     nics[i].colo_filter_sec_redirector1_outdev));
+                    }
+                    if (nics[i].colo_filter_sec_rewriter0_queue) {
+                        flexarray_append(dm_args, "-object");
+                        flexarray_append(dm_args,
+                           GCSPRINTF("filter-rewriter,id=rs3,netdev=net%d,queue=%s",
+                                     nics[i].devid,
+                                     nics[i].colo_filter_sec_rewriter0_queue));
+                    }
                 } else {
                     /* primary colo run */
 
diff --git a/tools/libxl/libxl_nic.c b/tools/libxl/libxl_nic.c
index 7c57bcf..5e1fecd 100644
--- a/tools/libxl/libxl_nic.c
+++ b/tools/libxl/libxl_nic.c
@@ -233,6 +233,20 @@ static void libxl__device_nic_add(libxl__egc *egc, uint32_t domid,
     MAYBE_ADD_COLO_ARGS(compare_sec_in);
     MAYBE_ADD_COLO_ARGS(compare_out);
 
+    MAYBE_ADD_COLO_ARGS(sock_sec_redirector0_id);
+    MAYBE_ADD_COLO_ARGS(sock_sec_redirector0_ip);
+    MAYBE_ADD_COLO_ARGS(sock_sec_redirector0_port);
+    MAYBE_ADD_COLO_ARGS(sock_sec_redirector1_id);
+    MAYBE_ADD_COLO_ARGS(sock_sec_redirector1_ip);
+    MAYBE_ADD_COLO_ARGS(sock_sec_redirector1_port);
+    MAYBE_ADD_COLO_ARGS(filter_sec_redirector0_queue);
+    MAYBE_ADD_COLO_ARGS(filter_sec_redirector0_indev);
+    MAYBE_ADD_COLO_ARGS(filter_sec_redirector0_outdev);
+    MAYBE_ADD_COLO_ARGS(filter_sec_redirector1_queue);
+    MAYBE_ADD_COLO_ARGS(filter_sec_redirector1_indev);
+    MAYBE_ADD_COLO_ARGS(filter_sec_redirector1_outdev);
+    MAYBE_ADD_COLO_ARGS(filter_sec_rewriter0_queue);
+
 #undef MAYBE_ADD_COLO_ARGS
 
     flexarray_append(back, "mac");
@@ -424,6 +438,19 @@ static int libxl__device_nic_from_xenstore(libxl__gc *gc,
     CHECK_COLO_ARGS(compare_pri_in);
     CHECK_COLO_ARGS(compare_sec_in);
     CHECK_COLO_ARGS(compare_out);
+    CHECK_COLO_ARGS(sock_sec_redirector0_id);
+    CHECK_COLO_ARGS(sock_sec_redirector0_ip);
+    CHECK_COLO_ARGS(sock_sec_redirector0_port);
+    CHECK_COLO_ARGS(sock_sec_redirector1_id);
+    CHECK_COLO_ARGS(sock_sec_redirector1_ip);
+    CHECK_COLO_ARGS(sock_sec_redirector1_port);
+    CHECK_COLO_ARGS(filter_sec_redirector0_queue);
+    CHECK_COLO_ARGS(filter_sec_redirector0_indev);
+    CHECK_COLO_ARGS(filter_sec_redirector0_outdev);
+    CHECK_COLO_ARGS(filter_sec_redirector1_queue);
+    CHECK_COLO_ARGS(filter_sec_redirector1_indev);
+    CHECK_COLO_ARGS(filter_sec_redirector1_outdev);
+    CHECK_COLO_ARGS(filter_sec_rewriter0_queue);
 
 #undef CHECK_COLO_ARGS
 
diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
index 07ce345..47e96b1 100644
--- a/tools/libxl/libxl_types.idl
+++ b/tools/libxl/libxl_types.idl
@@ -658,7 +658,20 @@ libxl_device_nic = Struct("device_nic", [
     ("colo_filter_redirector1_outdev", string),
     ("colo_compare_pri_in", string),
     ("colo_compare_sec_in", string),
-    ("colo_compare_out", string)
+    ("colo_compare_out", string),
+    ("colo_sock_sec_redirector0_id", string),
+    ("colo_sock_sec_redirector0_ip", string),
+    ("colo_sock_sec_redirector0_port", string),
+    ("colo_sock_sec_redirector1_id", string),
+    ("colo_sock_sec_redirector1_ip", string),
+    ("colo_sock_sec_redirector1_port", string),
+    ("colo_filter_sec_redirector0_queue", string),
+    ("colo_filter_sec_redirector0_indev", string),
+    ("colo_filter_sec_redirector0_outdev", string),
+    ("colo_filter_sec_redirector1_queue", string),
+    ("colo_filter_sec_redirector1_indev", string),
+    ("colo_filter_sec_redirector1_outdev", string),
+    ("colo_filter_sec_rewriter0_queue", string)
     ])
 
 libxl_device_pci = Struct("device_pci", [
diff --git a/tools/xl/xl_parse.c b/tools/xl/xl_parse.c
index 88ef1c6..d2bbe26 100644
--- a/tools/xl/xl_parse.c
+++ b/tools/xl/xl_parse.c
@@ -516,6 +516,33 @@ int parse_nic_config(libxl_device_nic *nic, XLU_Config **config, char *token)
         replace_string(&nic->colo_compare_sec_in, oparg);
     } else if (MATCH_OPTION("colo_compare_out", token, oparg)) {
         replace_string(&nic->colo_compare_out, oparg);
+
+    } else if (MATCH_OPTION("colo_sock_sec_redirector0_id", token, oparg)) {
+        replace_string(&nic->colo_sock_sec_redirector0_id, oparg);
+    } else if (MATCH_OPTION("colo_sock_sec_redirector0_ip", token, oparg)) {
+        replace_string(&nic->colo_sock_sec_redirector0_ip, oparg);
+    } else if (MATCH_OPTION("colo_sock_sec_redirector0_port", token, oparg)) {
+        replace_string(&nic->colo_sock_sec_redirector0_port, oparg);
+    } else if (MATCH_OPTION("colo_sock_sec_redirector1_id", token, oparg)) {
+        replace_string(&nic->colo_sock_sec_redirector1_id, oparg);
+    } else if (MATCH_OPTION("colo_sock_sec_redirector1_ip", token, oparg)) {
+        replace_string(&nic->colo_sock_sec_redirector1_ip, oparg);
+    } else if (MATCH_OPTION("colo_sock_sec_redirector1_port", token, oparg)) {
+        replace_string(&nic->colo_sock_sec_redirector1_port, oparg);
+    } else if (MATCH_OPTION("colo_filter_sec_redirector0_queue", token, oparg)) {
+        replace_string(&nic->colo_filter_sec_redirector0_queue, oparg);
+    } else if (MATCH_OPTION("colo_filter_sec_redirector0_indev", token, oparg)) {
+        replace_string(&nic->colo_filter_sec_redirector0_indev, oparg);
+    } else if (MATCH_OPTION("colo_filter_sec_redirector0_outdev", token, oparg)) {
+        replace_string(&nic->colo_filter_sec_redirector0_outdev, oparg);
+    } else if (MATCH_OPTION("colo_filter_sec_redirector1_queue", token, oparg)) {
+        replace_string(&nic->colo_filter_sec_redirector1_queue, oparg);
+    } else if (MATCH_OPTION("colo_filter_sec_redirector1_indev", token, oparg)) {
+        replace_string(&nic->colo_filter_sec_redirector1_indev, oparg);
+    } else if (MATCH_OPTION("colo_filter_sec_redirector1_outdev", token, oparg)) {
+        replace_string(&nic->colo_filter_sec_redirector1_outdev, oparg);
+    } else if (MATCH_OPTION("colo_filter_sec_rewriter0_queue", token, oparg)) {
+        replace_string(&nic->colo_filter_sec_rewriter0_queue, oparg);
     } else if (MATCH_OPTION("accel", token, oparg)) {
         fprintf(stderr, "the accel parameter for vifs is currently not supported\n");
     } else if (MATCH_OPTION("devid", token, oparg)) {
-- 
2.7.4




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH V4 6/8] COLO-Proxy: Add colo-compare notify args
  2017-03-06  2:59 [PATCH V4 0/8] COLO-Proxy: Make Xen COLO use userspace colo-proxy Zhang Chen
                   ` (4 preceding siblings ...)
  2017-03-06  2:59 ` [PATCH V4 5/8] COLO-Proxy: Add secondary userspace colo-proxy " Zhang Chen
@ 2017-03-06  2:59 ` Zhang Chen
  2017-03-14 11:24   ` Wei Liu
  2017-03-06  2:59 ` [PATCH V4 7/8] COLO-Proxy: Use socket to get checkpoint event Zhang Chen
                   ` (2 subsequent siblings)
  8 siblings, 1 reply; 24+ messages in thread
From: Zhang Chen @ 2017-03-06  2:59 UTC (permalink / raw)
  To: Xen devel, Wei Liu, Ian Jackson
  Cc: Zhang Chen, Li Zhijian, eddie dong, Yang Hongyang, Bian Naimeng

Xen colo-frame can use the notify way communicate with
qemu colo-compare.

Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
---
 tools/libxl/libxl_dm.c      | 12 +++++++++---
 tools/libxl/libxl_nic.c     |  8 ++++++++
 tools/libxl/libxl_types.idl |  4 ++++
 tools/xl/xl_parse.c         |  8 ++++++++
 4 files changed, 29 insertions(+), 3 deletions(-)

diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
index 0fabd64..4344c53 100644
--- a/tools/libxl/libxl_dm.c
+++ b/tools/libxl/libxl_dm.c
@@ -1323,6 +1323,10 @@ static int libxl__build_device_model_args_new(libxl__gc *gc,
                                             sock_compare_sec_in_ip,
                                             sock_compare_sec_in_port);
 
+                    APPEND_COLO_SOCK_SERVER(sock_compare_notify_id,
+                                            sock_compare_notify_ip,
+                                            sock_compare_notify_port);
+
                     APPEND_COLO_SOCK_SERVER(sock_redirector0_id,
                                             sock_redirector0_ip,
                                             sock_redirector0_port);
@@ -1364,13 +1368,15 @@ static int libxl__build_device_model_args_new(libxl__gc *gc,
                     }
                     if (nics[i].colo_compare_pri_in &&
                         nics[i].colo_compare_sec_in &&
-                        nics[i].colo_compare_out) {
+                        nics[i].colo_compare_out &&
+                        nics[i].colo_compare_notify_dev) {
                         flexarray_append(dm_args, "-object");
                         flexarray_append(dm_args,
-                           GCSPRINTF("colo-compare,id=c1,primary_in=%s,secondary_in=%s,outdev=%s",
+                           GCSPRINTF("colo-compare,id=c1,primary_in=%s,secondary_in=%s,outdev=%s,notify_dev=%s",
                                      nics[i].colo_compare_pri_in,
                                      nics[i].colo_compare_sec_in,
-                                     nics[i].colo_compare_out));
+                                     nics[i].colo_compare_out,
+                                     nics[i].colo_compare_notify_dev));
                     }
                 }
                 ioemu_nics++;
diff --git a/tools/libxl/libxl_nic.c b/tools/libxl/libxl_nic.c
index 5e1fecd..33954a2 100644
--- a/tools/libxl/libxl_nic.c
+++ b/tools/libxl/libxl_nic.c
@@ -212,6 +212,9 @@ static void libxl__device_nic_add(libxl__egc *egc, uint32_t domid,
     MAYBE_ADD_COLO_ARGS(sock_compare_sec_in_id);
     MAYBE_ADD_COLO_ARGS(sock_compare_sec_in_ip);
     MAYBE_ADD_COLO_ARGS(sock_compare_sec_in_port);
+    MAYBE_ADD_COLO_ARGS(sock_compare_notify_id);
+    MAYBE_ADD_COLO_ARGS(sock_compare_notify_ip);
+    MAYBE_ADD_COLO_ARGS(sock_compare_notify_port);
     MAYBE_ADD_COLO_ARGS(sock_redirector0_id);
     MAYBE_ADD_COLO_ARGS(sock_redirector0_ip);
     MAYBE_ADD_COLO_ARGS(sock_redirector0_port);
@@ -232,6 +235,7 @@ static void libxl__device_nic_add(libxl__egc *egc, uint32_t domid,
     MAYBE_ADD_COLO_ARGS(compare_pri_in);
     MAYBE_ADD_COLO_ARGS(compare_sec_in);
     MAYBE_ADD_COLO_ARGS(compare_out);
+    MAYBE_ADD_COLO_ARGS(compare_notify_dev);
 
     MAYBE_ADD_COLO_ARGS(sock_sec_redirector0_id);
     MAYBE_ADD_COLO_ARGS(sock_sec_redirector0_ip);
@@ -418,6 +422,9 @@ static int libxl__device_nic_from_xenstore(libxl__gc *gc,
     CHECK_COLO_ARGS(sock_compare_sec_in_id);
     CHECK_COLO_ARGS(sock_compare_sec_in_ip);
     CHECK_COLO_ARGS(sock_compare_sec_in_port);
+    CHECK_COLO_ARGS(sock_compare_notify_id);
+    CHECK_COLO_ARGS(sock_compare_notify_ip);
+    CHECK_COLO_ARGS(sock_compare_notify_port);
     CHECK_COLO_ARGS(sock_redirector0_id);
     CHECK_COLO_ARGS(sock_redirector0_ip);
     CHECK_COLO_ARGS(sock_redirector0_port);
@@ -438,6 +445,7 @@ static int libxl__device_nic_from_xenstore(libxl__gc *gc,
     CHECK_COLO_ARGS(compare_pri_in);
     CHECK_COLO_ARGS(compare_sec_in);
     CHECK_COLO_ARGS(compare_out);
+    CHECK_COLO_ARGS(compare_notify_dev);
     CHECK_COLO_ARGS(sock_sec_redirector0_id);
     CHECK_COLO_ARGS(sock_sec_redirector0_ip);
     CHECK_COLO_ARGS(sock_sec_redirector0_port);
diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
index 47e96b1..516bd79 100644
--- a/tools/libxl/libxl_types.idl
+++ b/tools/libxl/libxl_types.idl
@@ -639,6 +639,9 @@ libxl_device_nic = Struct("device_nic", [
     ("colo_sock_compare_sec_in_id", string),
     ("colo_sock_compare_sec_in_ip", string),
     ("colo_sock_compare_sec_in_port", string),
+    ("colo_sock_compare_notify_id", string),
+    ("colo_sock_compare_notify_ip", string),
+    ("colo_sock_compare_notify_port", string),
     ("colo_sock_redirector0_id", string),
     ("colo_sock_redirector0_ip", string),
     ("colo_sock_redirector0_port", string),
@@ -659,6 +662,7 @@ libxl_device_nic = Struct("device_nic", [
     ("colo_compare_pri_in", string),
     ("colo_compare_sec_in", string),
     ("colo_compare_out", string),
+    ("colo_compare_notify_dev", string),
     ("colo_sock_sec_redirector0_id", string),
     ("colo_sock_sec_redirector0_ip", string),
     ("colo_sock_sec_redirector0_port", string),
diff --git a/tools/xl/xl_parse.c b/tools/xl/xl_parse.c
index d2bbe26..77e91c8 100644
--- a/tools/xl/xl_parse.c
+++ b/tools/xl/xl_parse.c
@@ -494,6 +494,12 @@ int parse_nic_config(libxl_device_nic *nic, XLU_Config **config, char *token)
         replace_string(&nic->colo_sock_compare_pri_in_ip, oparg);
     } else if (MATCH_OPTION("colo_sock_compare_pri_in_port", token, oparg)) {
         replace_string(&nic->colo_sock_compare_pri_in_port, oparg);
+    } else if (MATCH_OPTION("colo_sock_compare_notify_id", token, oparg)) {
+        replace_string(&nic->colo_sock_compare_notify_id, oparg);
+    } else if (MATCH_OPTION("colo_sock_compare_notify_ip", token, oparg)) {
+        replace_string(&nic->colo_sock_compare_notify_ip, oparg);
+    } else if (MATCH_OPTION("colo_sock_compare_notify_port", token, oparg)) {
+        replace_string(&nic->colo_sock_compare_notify_port, oparg);
     } else if (MATCH_OPTION("colo_filter_mirror_queue", token, oparg)) {
         replace_string(&nic->colo_filter_mirror_queue, oparg);
     } else if (MATCH_OPTION("colo_filter_mirror_outdev", token, oparg)) {
@@ -516,6 +522,8 @@ int parse_nic_config(libxl_device_nic *nic, XLU_Config **config, char *token)
         replace_string(&nic->colo_compare_sec_in, oparg);
     } else if (MATCH_OPTION("colo_compare_out", token, oparg)) {
         replace_string(&nic->colo_compare_out, oparg);
+    } else if (MATCH_OPTION("colo_compare_notify_dev", token, oparg)) {
+        replace_string(&nic->colo_compare_notify_dev, oparg);
 
     } else if (MATCH_OPTION("colo_sock_sec_redirector0_id", token, oparg)) {
         replace_string(&nic->colo_sock_sec_redirector0_id, oparg);
-- 
2.7.4




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH V4 7/8] COLO-Proxy: Use socket to get checkpoint event.
  2017-03-06  2:59 [PATCH V4 0/8] COLO-Proxy: Make Xen COLO use userspace colo-proxy Zhang Chen
                   ` (5 preceding siblings ...)
  2017-03-06  2:59 ` [PATCH V4 6/8] COLO-Proxy: Add colo-compare notify args Zhang Chen
@ 2017-03-06  2:59 ` Zhang Chen
  2017-03-14 11:24   ` Wei Liu
  2017-03-06  2:59 ` [PATCH V4 8/8] COLO-proxy: Add colo_userspace_proxy macro Zhang Chen
  2017-03-06 14:31 ` [PATCH V4 0/8] COLO-Proxy: Make Xen COLO use userspace colo-proxy Konrad Rzeszutek Wilk
  8 siblings, 1 reply; 24+ messages in thread
From: Zhang Chen @ 2017-03-06  2:59 UTC (permalink / raw)
  To: Xen devel, Wei Liu, Ian Jackson
  Cc: Zhang Chen, Li Zhijian, eddie dong, Yang Hongyang, Bian Naimeng

We use kernel colo proxy's way to get the checkpoint event
from qemu colo-compare.
Qemu colo-compare need add a API to support this(I will add this in qemu).
Qemu side patch:
 https://lists.nongnu.org/archive/html/qemu-devel/2017-02/msg07265.html

Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
---
 tools/libxl/libxl_colo.h         |   2 +
 tools/libxl/libxl_colo_proxy.c   | 126 +++++++++++++++++++++++++++++++++++++--
 tools/libxl/libxl_colo_restore.c |  11 ++--
 tools/libxl/libxl_colo_save.c    |  21 ++++---
 tools/libxl/libxl_nic.c          |   4 ++
 tools/libxl/libxl_types.idl      |   4 +-
 tools/xl/xl_parse.c              |   4 ++
 7 files changed, 156 insertions(+), 16 deletions(-)

diff --git a/tools/libxl/libxl_colo.h b/tools/libxl/libxl_colo.h
index 4746d8c..6c01b55 100644
--- a/tools/libxl/libxl_colo.h
+++ b/tools/libxl/libxl_colo.h
@@ -69,6 +69,8 @@ struct libxl__colo_proxy_state {
      *          False means use kernel colo proxy.
      */
     bool is_userspace_proxy;
+    const char *checkpoint_host;
+    const char *checkpoint_port;
 };
 
 struct libxl__colo_save_state {
diff --git a/tools/libxl/libxl_colo_proxy.c b/tools/libxl/libxl_colo_proxy.c
index ec76e37..c3d5510 100644
--- a/tools/libxl/libxl_colo_proxy.c
+++ b/tools/libxl/libxl_colo_proxy.c
@@ -18,9 +18,13 @@
 #include "libxl_internal.h"
 
 #include <netlink/netlink.h>
+#include <arpa/inet.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
 
 /* Consistent with the new COLO netlink channel in kernel side */
 #define NETLINK_COLO 28
+#define COLO_DEFAULT_WAIT_TIME 500000
 
 enum colo_netlink_op {
     COLO_QUERY_CHECKPOINT = (NLMSG_MIN_TYPE + 1),
@@ -76,6 +80,63 @@ static int colo_proxy_send(libxl__colo_proxy_state *cps, uint8_t *buff,
     return ret;
 }
 
+static int colo_userspace_proxy_send(libxl__colo_proxy_state *cps,
+                                     uint8_t *buff,
+                                     uint32_t size)
+{
+    int ret = 0;
+    uint32_t len = 0;
+
+    len = htonl(size);
+    ret = send(cps->sock_fd, (uint8_t *)&len, sizeof(len), 0);
+    if (ret != sizeof(len)) {
+        goto err;
+    }
+
+    ret = send(cps->sock_fd, (uint8_t *)buff, size, 0);
+    if (ret != size) {
+        goto err;
+    }
+
+err:
+    return ret;
+}
+
+static int colo_userspace_proxy_recv(libxl__colo_proxy_state *cps,
+                                     char *buff,
+                                     unsigned int timeout_us)
+{
+    struct timeval tv;
+    int ret;
+    uint32_t len = 0;
+    uint32_t size = 0;
+
+    STATE_AO_GC(cps->ao);
+
+    if (timeout_us) {
+        tv.tv_sec = timeout_us / 1000000;
+        tv.tv_usec = timeout_us % 1000000;
+        ret = setsockopt(cps->sock_fd, SOL_SOCKET, SO_RCVTIMEO, &tv,
+                         sizeof(tv));
+        if (ret < 0) {
+            LOGD(ERROR, ao->domid,
+                 "colo_userspace_proxy_recv setsockopt error: %s",
+                 strerror(errno));
+        }
+    }
+
+    ret = recv(cps->sock_fd, (uint8_t *)&len, sizeof(len), 0);
+    if (ret < 0) {
+        goto err;
+    }
+
+    size = ntohl(len);
+    ret = recv(cps->sock_fd, buff, size, 0);
+
+err:
+    return ret;
+}
+
 /* error: return -1, otherwise return 0 */
 static int64_t colo_proxy_recv(libxl__colo_proxy_state *cps, uint8_t **buff,
                                unsigned int timeout_us)
@@ -153,8 +214,45 @@ int colo_proxy_setup(libxl__colo_proxy_state *cps)
     STATE_AO_GC(cps->ao);
 
     /* If enable userspace proxy mode, we don't need setup kernel proxy */
-    if (cps->is_userspace_proxy)
+    if (cps->is_userspace_proxy) {
+        struct sockaddr_in addr;
+        int port;
+        char recvbuff[1024];
+        const char sendbuf[] = "COLO_USERSPACE_PROXY_INIT";
+
+        memset(&addr, 0, sizeof(addr));
+        port = atoi(cps->checkpoint_port);
+        addr.sin_family = AF_INET;
+        addr.sin_port = htons(port);
+        addr.sin_addr.s_addr = inet_addr(cps->checkpoint_host);
+
+        skfd = socket(AF_INET, SOCK_STREAM, 0);
+        if (skfd < 0) {
+            LOGD(ERROR, ao->domid, "can not create a TCP socket: %s",
+                 strerror(errno));
+            goto out;
+        }
+
+        cps->sock_fd = skfd;
+
+        if (connect(skfd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
+            LOGD(ERROR, ao->domid, "connect error");
+            goto out;
+        }
+
+        ret = colo_userspace_proxy_send(cps, (uint8_t *)sendbuf, strlen(sendbuf));
+        if (ret < 0)
+            goto out;
+
+        ret = colo_userspace_proxy_recv(cps, recvbuff, COLO_DEFAULT_WAIT_TIME);
+        if (ret < 0) {
+            LOGD(ERROR, ao->domid, "Can't recv msg from qemu colo-compare: %s",
+                 strerror(errno));
+            goto out;
+        }
+
         return 0;
+    }
 
     skfd = socket(PF_NETLINK, SOCK_RAW, NETLINK_COLO);
     if (skfd < 0) {
@@ -247,8 +345,13 @@ void colo_proxy_preresume(libxl__colo_proxy_state *cps)
      * If enable userspace proxy mode,
      * we don't need preresume kernel proxy
      */
-    if (cps->is_userspace_proxy)
+    if (cps->is_userspace_proxy) {
+        const char sendbuf[] = "COLO_CHECKPOINT";
+        colo_userspace_proxy_send(cps,
+                                  (uint8_t *)sendbuf,
+                                  strlen(sendbuf));
         return;
+    }
 
     colo_proxy_send(cps, NULL, 0, COLO_CHECKPOINT);
     /* TODO: need to handle if the call fails... */
@@ -277,6 +380,7 @@ int colo_proxy_checkpoint(libxl__colo_proxy_state *cps,
     struct nlmsghdr *h;
     struct colo_msg *m;
     int ret = -1;
+    char recvbuff[1024];
 
     STATE_AO_GC(cps->ao);
 
@@ -289,8 +393,19 @@ int colo_proxy_checkpoint(libxl__colo_proxy_state *cps,
      * event.
      */
     if (cps->is_userspace_proxy) {
-        usleep(timeout_us);
-        return 0;
+        ret = colo_userspace_proxy_recv(cps, recvbuff, timeout_us);
+        if (ret <= 0) {
+            ret = 0;
+            goto out1;
+        }
+
+        if (!strcmp(recvbuff, "DO_CHECKPOINT")) {
+            ret = 1;
+        } else {
+            LOGD(ERROR, ao->domid, "receive qemu colo-compare checkpoint error");
+            ret = 0;
+        }
+        goto out1;
     }
 
     size = colo_proxy_recv(cps, &buff, timeout_us);
@@ -318,4 +433,7 @@ int colo_proxy_checkpoint(libxl__colo_proxy_state *cps,
 out:
     free(buff);
     return ret;
+
+out1:
+    return ret;
 }
diff --git a/tools/libxl/libxl_colo_restore.c b/tools/libxl/libxl_colo_restore.c
index c6d239a..065ea00 100644
--- a/tools/libxl/libxl_colo_restore.c
+++ b/tools/libxl/libxl_colo_restore.c
@@ -613,7 +613,8 @@ static void colo_restore_preresume_cb(libxl__egc *egc,
         }
     }
 
-    colo_proxy_preresume(&crs->cps);
+    if (!crs->cps.is_userspace_proxy)
+        colo_proxy_preresume(&crs->cps);
 
     colo_restore_resume_vm(egc, crcs);
 
@@ -786,9 +787,11 @@ static void colo_setup_checkpoint_devices(libxl__egc *egc,
     cds->ops = colo_restore_ops;
 
     crs->cps.ao = ao;
-    if (colo_proxy_setup(&crs->cps)) {
-        LOGD(ERROR, cds->domid, "COLO: failed to setup colo proxy for guest");
-        goto out;
+    if (!crs->cps.is_userspace_proxy) {
+        if (colo_proxy_setup(&crs->cps)) {
+            LOGD(ERROR, cds->domid, "COLO: failed to setup colo proxy for guest");
+            goto out;
+        }
     }
 
     if (init_device_subkind(cds))
diff --git a/tools/libxl/libxl_colo_save.c b/tools/libxl/libxl_colo_save.c
index 91e3fce..b4ca9f6 100644
--- a/tools/libxl/libxl_colo_save.c
+++ b/tools/libxl/libxl_colo_save.c
@@ -86,6 +86,7 @@ void libxl__colo_save_setup(libxl__egc *egc, libxl__colo_save_state *css)
     libxl__checkpoint_devices_state *const cds = &dss->cds;
     libxl__srm_save_autogen_callbacks *const callbacks =
         &dss->sws.shs.callbacks.save.a;
+    libxl_device_nic *nics;
 
     STATE_AO_GC(dss->ao);
 
@@ -110,19 +111,25 @@ void libxl__colo_save_setup(libxl__egc *egc, libxl__colo_save_state *css)
         css->colo_proxy_script = GCSPRINTF("%s/colo-proxy-setup",
                                            libxl__xen_script_dir_path());
 
-    /* If enable userspace proxy mode, we don't need VIF */
-    if (css->cps.is_userspace_proxy)
-        cds->device_kind_flags = (1 << LIBXL__DEVICE_KIND_VBD);
-    else
-        cds->device_kind_flags = (1 << LIBXL__DEVICE_KIND_VIF) |
-                                 (1 << LIBXL__DEVICE_KIND_VBD);
-
     cds->ops = colo_ops;
     cds->callback = colo_save_setup_done;
     cds->ao = ao;
     cds->domid = dss->domid;
     cds->concrete_data = css;
 
+    /* If enable userspace proxy mode, we don't need VIF */
+    if (css->cps.is_userspace_proxy) {
+        cds->device_kind_flags = (1 << LIBXL__DEVICE_KIND_VBD);
+
+        /* Use this args we can connect to qemu colo-compare */
+        nics = libxl_device_nic_list(CTX, cds->domid, &cds->num_nics);
+        css->cps.checkpoint_host = nics->colo_checkpoint_host;
+        css->cps.checkpoint_port = nics->colo_checkpoint_port;
+    } else {
+        cds->device_kind_flags = (1 << LIBXL__DEVICE_KIND_VIF) |
+                                 (1 << LIBXL__DEVICE_KIND_VBD);
+    }
+
     css->srs.ao = ao;
     css->srs.fd = css->recv_fd;
     css->srs.back_channel = true;
diff --git a/tools/libxl/libxl_nic.c b/tools/libxl/libxl_nic.c
index 33954a2..4b6e8c0 100644
--- a/tools/libxl/libxl_nic.c
+++ b/tools/libxl/libxl_nic.c
@@ -250,6 +250,8 @@ static void libxl__device_nic_add(libxl__egc *egc, uint32_t domid,
     MAYBE_ADD_COLO_ARGS(filter_sec_redirector1_indev);
     MAYBE_ADD_COLO_ARGS(filter_sec_redirector1_outdev);
     MAYBE_ADD_COLO_ARGS(filter_sec_rewriter0_queue);
+    MAYBE_ADD_COLO_ARGS(checkpoint_host);
+    MAYBE_ADD_COLO_ARGS(checkpoint_port);
 
 #undef MAYBE_ADD_COLO_ARGS
 
@@ -459,6 +461,8 @@ static int libxl__device_nic_from_xenstore(libxl__gc *gc,
     CHECK_COLO_ARGS(filter_sec_redirector1_indev);
     CHECK_COLO_ARGS(filter_sec_redirector1_outdev);
     CHECK_COLO_ARGS(filter_sec_rewriter0_queue);
+    CHECK_COLO_ARGS(checkpoint_host);
+    CHECK_COLO_ARGS(checkpoint_port);
 
 #undef CHECK_COLO_ARGS
 
diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
index 516bd79..6d28dea 100644
--- a/tools/libxl/libxl_types.idl
+++ b/tools/libxl/libxl_types.idl
@@ -675,7 +675,9 @@ libxl_device_nic = Struct("device_nic", [
     ("colo_filter_sec_redirector1_queue", string),
     ("colo_filter_sec_redirector1_indev", string),
     ("colo_filter_sec_redirector1_outdev", string),
-    ("colo_filter_sec_rewriter0_queue", string)
+    ("colo_filter_sec_rewriter0_queue", string),
+    ("colo_checkpoint_host", string),
+    ("colo_checkpoint_port", string)
     ])
 
 libxl_device_pci = Struct("device_pci", [
diff --git a/tools/xl/xl_parse.c b/tools/xl/xl_parse.c
index 77e91c8..0787337 100644
--- a/tools/xl/xl_parse.c
+++ b/tools/xl/xl_parse.c
@@ -551,6 +551,10 @@ int parse_nic_config(libxl_device_nic *nic, XLU_Config **config, char *token)
         replace_string(&nic->colo_filter_sec_redirector1_outdev, oparg);
     } else if (MATCH_OPTION("colo_filter_sec_rewriter0_queue", token, oparg)) {
         replace_string(&nic->colo_filter_sec_rewriter0_queue, oparg);
+    } else if (MATCH_OPTION("colo_checkpoint_host", token, oparg)) {
+        replace_string(&nic->colo_checkpoint_host, oparg);
+    } else if (MATCH_OPTION("colo_checkpoint_port", token, oparg)) {
+        replace_string(&nic->colo_checkpoint_port, oparg);
     } else if (MATCH_OPTION("accel", token, oparg)) {
         fprintf(stderr, "the accel parameter for vifs is currently not supported\n");
     } else if (MATCH_OPTION("devid", token, oparg)) {
-- 
2.7.4




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH V4 8/8] COLO-proxy: Add colo_userspace_proxy macro
  2017-03-06  2:59 [PATCH V4 0/8] COLO-Proxy: Make Xen COLO use userspace colo-proxy Zhang Chen
                   ` (6 preceding siblings ...)
  2017-03-06  2:59 ` [PATCH V4 7/8] COLO-Proxy: Use socket to get checkpoint event Zhang Chen
@ 2017-03-06  2:59 ` Zhang Chen
  2017-03-14 11:24   ` Wei Liu
  2017-03-06 14:31 ` [PATCH V4 0/8] COLO-Proxy: Make Xen COLO use userspace colo-proxy Konrad Rzeszutek Wilk
  8 siblings, 1 reply; 24+ messages in thread
From: Zhang Chen @ 2017-03-06  2:59 UTC (permalink / raw)
  To: Xen devel, Wei Liu, Ian Jackson
  Cc: Zhang Chen, Li Zhijian, eddie dong, Yang Hongyang, Bian Naimeng

Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
---
 tools/libxl/libxl.h | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
index 92f1751..4c60e8f 100644
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -870,6 +870,12 @@ typedef struct libxl__ctx libxl_ctx;
  */
 #define LIBXL_HAVE_REMUS 1
 
+/*
+ * LIBXL_HAVE_COLO_USERSPACE_PROXY
+ * If this is defined, then libxl supports COLO userspace proxy.
+ */
+#define LIBXL_HAVE_COLO_USERSPACE_PROXY 1
+
 typedef uint8_t libxl_mac[6];
 #define LIBXL_MAC_FMT "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx"
 #define LIBXL_MAC_FMTLEN ((2*6)+5) /* 6 hex bytes plus 5 colons */
-- 
2.7.4




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* Re: [PATCH V4 0/8] COLO-Proxy: Make Xen COLO use userspace colo-proxy
  2017-03-06  2:59 [PATCH V4 0/8] COLO-Proxy: Make Xen COLO use userspace colo-proxy Zhang Chen
                   ` (7 preceding siblings ...)
  2017-03-06  2:59 ` [PATCH V4 8/8] COLO-proxy: Add colo_userspace_proxy macro Zhang Chen
@ 2017-03-06 14:31 ` Konrad Rzeszutek Wilk
  2017-03-07  3:25   ` Zhang Chen
  8 siblings, 1 reply; 24+ messages in thread
From: Konrad Rzeszutek Wilk @ 2017-03-06 14:31 UTC (permalink / raw)
  To: Zhang Chen
  Cc: Wei Liu, Li Zhijian, Ian Jackson, eddie dong, Yang Hongyang,
	Xen devel, Bian Naimeng

On Mon, Mar 06, 2017 at 10:59:18AM +0800, Zhang Chen wrote:
> Because of some reason, We no longer support COLO kernel proxy.

However the #7 talks about kernel colo proxy? Is this description
out-dated?

> V4:

One usually adds these comments to the patches. That is
right after the '---' you say:

v4: New patch

(for the new patches)

Or for the older patches (like #7):

v4: Fix typo.
    Fix 'some bug' (perhaps be specific).

>    - Because the origin 3/7 has been merged,
>      remove it in this series.
>    - Add new patch "COLO-Proxy: Add colo-compare notify args"
>      to support qemu side patch:
>      https://lists.nongnu.org/archive/html/qemu-devel/2017-02/msg07265.html
> 
>    - Add colo_userspace_proxy macro as a separate patch.
>    - Add some comments about COLO and fix some typo in patch 2/7.
>    - Fix some bug and typo in patch 7/7.

But the subject is 0/8? So it can't be 7/7. Did you mean
7/8? or 8/8/?

>    - Rebase codes on upstream Xen.

Thanks!

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH V4 0/8] COLO-Proxy: Make Xen COLO use userspace colo-proxy
  2017-03-06 14:31 ` [PATCH V4 0/8] COLO-Proxy: Make Xen COLO use userspace colo-proxy Konrad Rzeszutek Wilk
@ 2017-03-07  3:25   ` Zhang Chen
  0 siblings, 0 replies; 24+ messages in thread
From: Zhang Chen @ 2017-03-07  3:25 UTC (permalink / raw)
  To: Konrad Rzeszutek Wilk
  Cc: Wei Liu, zhangchen.fnst, Li Zhijian, Ian Jackson, eddie dong,
	Yang Hongyang, Xen devel, Bian Naimeng



On 03/06/2017 10:31 PM, Konrad Rzeszutek Wilk wrote:
> On Mon, Mar 06, 2017 at 10:59:18AM +0800, Zhang Chen wrote:
>> Because of some reason, We no longer support COLO kernel proxy.
> However the #7 talks about kernel colo proxy? Is this description
> out-dated?

In patch 7/8, the comments:

We use kernel colo proxy's way to get the checkpoint event
from qemu colo-compare.

Here, I mean we use same method communicate with qemu colo-compare
like colo kernel proxy do, we both use the socket.

>> V4:
> One usually adds these comments to the patches. That is
> right after the '---' you say:
>
> v4: New patch
>
> (for the new patches)
>
> Or for the older patches (like #7):
>
> v4: Fix typo.
>      Fix 'some bug' (perhaps be specific).

OK, I will add version comments in patches next version.

>
>>     - Because the origin 3/7 has been merged,
>>       remove it in this series.
>>     - Add new patch "COLO-Proxy: Add colo-compare notify args"
>>       to support qemu side patch:
>>       https://lists.nongnu.org/archive/html/qemu-devel/2017-02/msg07265.html
>>
>>     - Add colo_userspace_proxy macro as a separate patch.
>>     - Add some comments about COLO and fix some typo in patch 2/7.
>>     - Fix some bug and typo in patch 7/7.
> But the subject is 0/8? So it can't be 7/7. Did you mean
> 7/8? or 8/8/?

Sorry, s/"7/7"/"7/8",  s/"2/7"/"2/8".

Thanks
Zhang Chen

>
>>     - Rebase codes on upstream Xen.
> Thanks!
>
>
> .
>

-- 
Thanks
Zhang Chen




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH V4 1/8] COLO-Proxy: Add remus command to open userspace proxy
  2017-03-06  2:59 ` [PATCH V4 1/8] COLO-Proxy: Add remus command to open userspace proxy Zhang Chen
@ 2017-03-14 11:23   ` Wei Liu
  0 siblings, 0 replies; 24+ messages in thread
From: Wei Liu @ 2017-03-14 11:23 UTC (permalink / raw)
  To: Zhang Chen
  Cc: Wei Liu, Li Zhijian, Ian Jackson, eddie dong, Yang Hongyang,
	Xen devel, Bian Naimeng

On Mon, Mar 06, 2017 at 10:59:19AM +0800, Zhang Chen wrote:
> Add remus '-p' to enable userspace colo proxy(in qemu).
> 
> Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>

Acked-by: Wei Liu <wei.liu2@citrix.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH V4 2/8] COLO-Proxy: Setup userspace colo-proxy on primary side
  2017-03-06  2:59 ` [PATCH V4 2/8] COLO-Proxy: Setup userspace colo-proxy on primary side Zhang Chen
@ 2017-03-14 11:24   ` Wei Liu
  0 siblings, 0 replies; 24+ messages in thread
From: Wei Liu @ 2017-03-14 11:24 UTC (permalink / raw)
  To: Zhang Chen
  Cc: Wei Liu, Li Zhijian, Ian Jackson, eddie dong, Yang Hongyang,
	Xen devel, Bian Naimeng

On Mon, Mar 06, 2017 at 10:59:20AM +0800, Zhang Chen wrote:
> In this patch we close kernel COLO-Proxy on primary side.
> 
> Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>

Acked-by: Wei Liu <wei.liu2@citrix.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH V4 3/8] COLO-Proxy: Setup userspace colo-proxy on secondary side
  2017-03-06  2:59 ` [PATCH V4 3/8] COLO-Proxy: Setup userspace colo-proxy on secondary side Zhang Chen
@ 2017-03-14 11:24   ` Wei Liu
  0 siblings, 0 replies; 24+ messages in thread
From: Wei Liu @ 2017-03-14 11:24 UTC (permalink / raw)
  To: Zhang Chen
  Cc: Wei Liu, Li Zhijian, Ian Jackson, eddie dong, Yang Hongyang,
	Xen devel, Bian Naimeng

On Mon, Mar 06, 2017 at 10:59:21AM +0800, Zhang Chen wrote:
> In this patch we add a function to close COLO kernel Proxy on secondary side.
> 
> Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>

Acked-by: Wei Liu <wei.liu2@citrix.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH V4 4/8] COLO-Proxy: Add primary userspace colo proxy start args
  2017-03-06  2:59 ` [PATCH V4 4/8] COLO-Proxy: Add primary userspace colo proxy start args Zhang Chen
@ 2017-03-14 11:24   ` Wei Liu
  0 siblings, 0 replies; 24+ messages in thread
From: Wei Liu @ 2017-03-14 11:24 UTC (permalink / raw)
  To: Zhang Chen
  Cc: Wei Liu, Li Zhijian, Ian Jackson, eddie dong, Yang Hongyang,
	Xen devel, Bian Naimeng

On Mon, Mar 06, 2017 at 10:59:22AM +0800, Zhang Chen wrote:
> Qemu need this args to start userspace colo-proxy.
> 
> Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>

Acked-by: Wei Liu <wei.liu2@citrix.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH V4 5/8] COLO-Proxy: Add secondary userspace colo-proxy start args
  2017-03-06  2:59 ` [PATCH V4 5/8] COLO-Proxy: Add secondary userspace colo-proxy " Zhang Chen
@ 2017-03-14 11:24   ` Wei Liu
  2017-03-14 11:39     ` Wei Liu
  0 siblings, 1 reply; 24+ messages in thread
From: Wei Liu @ 2017-03-14 11:24 UTC (permalink / raw)
  To: Zhang Chen
  Cc: Wei Liu, Li Zhijian, Ian Jackson, eddie dong, Yang Hongyang,
	Xen devel, Bian Naimeng

On Mon, Mar 06, 2017 at 10:59:23AM +0800, Zhang Chen wrote:
> Qemu need this args to start userspace colo-proxy.
> 
> Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>

Acked-by: Wei Liu <wei.liu2@citrix.com>

> diff --git a/tools/xl/xl_parse.c b/tools/xl/xl_parse.c
> index 88ef1c6..d2bbe26 100644
> --- a/tools/xl/xl_parse.c
> +++ b/tools/xl/xl_parse.c
> @@ -516,6 +516,33 @@ int parse_nic_config(libxl_device_nic *nic, XLU_Config **config, char *token)
>          replace_string(&nic->colo_compare_sec_in, oparg);
>      } else if (MATCH_OPTION("colo_compare_out", token, oparg)) {
>          replace_string(&nic->colo_compare_out, oparg);
> +

Stray blank line -- will try to fix it up while committing.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH V4 6/8] COLO-Proxy: Add colo-compare notify args
  2017-03-06  2:59 ` [PATCH V4 6/8] COLO-Proxy: Add colo-compare notify args Zhang Chen
@ 2017-03-14 11:24   ` Wei Liu
  0 siblings, 0 replies; 24+ messages in thread
From: Wei Liu @ 2017-03-14 11:24 UTC (permalink / raw)
  To: Zhang Chen
  Cc: Wei Liu, Li Zhijian, Ian Jackson, eddie dong, Yang Hongyang,
	Xen devel, Bian Naimeng

On Mon, Mar 06, 2017 at 10:59:24AM +0800, Zhang Chen wrote:
> Xen colo-frame can use the notify way communicate with
> qemu colo-compare.
> 
> Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>

Acked-by: Wei Liu <wei.liu2@citrix.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH V4 7/8] COLO-Proxy: Use socket to get checkpoint event.
  2017-03-06  2:59 ` [PATCH V4 7/8] COLO-Proxy: Use socket to get checkpoint event Zhang Chen
@ 2017-03-14 11:24   ` Wei Liu
  2017-03-15  2:02     ` Zhang Chen
  0 siblings, 1 reply; 24+ messages in thread
From: Wei Liu @ 2017-03-14 11:24 UTC (permalink / raw)
  To: Zhang Chen
  Cc: Wei Liu, Li Zhijian, Ian Jackson, eddie dong, Yang Hongyang,
	Xen devel, Bian Naimeng

On Mon, Mar 06, 2017 at 10:59:25AM +0800, Zhang Chen wrote:
> We use kernel colo proxy's way to get the checkpoint event
> from qemu colo-compare.
> Qemu colo-compare need add a API to support this(I will add this in qemu).
> Qemu side patch:
>  https://lists.nongnu.org/archive/html/qemu-devel/2017-02/msg07265.html
> 
> Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>

Acked-by: Wei Liu <wei.liu2@citrix.com>

But see below.

> @@ -289,8 +393,19 @@ int colo_proxy_checkpoint(libxl__colo_proxy_state *cps,
>       * event.
>       */
>      if (cps->is_userspace_proxy) {
> -        usleep(timeout_us);
> -        return 0;
> +        ret = colo_userspace_proxy_recv(cps, recvbuff, timeout_us);
> +        if (ret <= 0) {
> +            ret = 0;
> +            goto out1;
> +        }
> +
> +        if (!strcmp(recvbuff, "DO_CHECKPOINT")) {
> +            ret = 1;
> +        } else {
> +            LOGD(ERROR, ao->domid, "receive qemu colo-compare checkpoint error");
> +            ret = 0;
> +        }
> +        goto out1;
>      }
>  
>      size = colo_proxy_recv(cps, &buff, timeout_us);
> @@ -318,4 +433,7 @@ int colo_proxy_checkpoint(libxl__colo_proxy_state *cps,
>  out:
>      free(buff);
>      return ret;
> +
> +out1:

Perhaps try to come up with a better name than out1? Subsequent patch is
welcome.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH V4 8/8] COLO-proxy: Add colo_userspace_proxy macro
  2017-03-06  2:59 ` [PATCH V4 8/8] COLO-proxy: Add colo_userspace_proxy macro Zhang Chen
@ 2017-03-14 11:24   ` Wei Liu
  0 siblings, 0 replies; 24+ messages in thread
From: Wei Liu @ 2017-03-14 11:24 UTC (permalink / raw)
  To: Zhang Chen
  Cc: Wei Liu, Li Zhijian, Ian Jackson, eddie dong, Yang Hongyang,
	Xen devel, Bian Naimeng

On Mon, Mar 06, 2017 at 10:59:26AM +0800, Zhang Chen wrote:
> Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>

Acked-by: Wei Liu <wei.liu2@citrix.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH V4 5/8] COLO-Proxy: Add secondary userspace colo-proxy start args
  2017-03-14 11:24   ` Wei Liu
@ 2017-03-14 11:39     ` Wei Liu
  2017-03-15  1:53       ` Zhang Chen
  0 siblings, 1 reply; 24+ messages in thread
From: Wei Liu @ 2017-03-14 11:39 UTC (permalink / raw)
  To: Zhang Chen
  Cc: Wei Liu, Li Zhijian, Ian Jackson, eddie dong, Yang Hongyang,
	Xen devel, Bian Naimeng

On Tue, Mar 14, 2017 at 11:24:12AM +0000, Wei Liu wrote:
> On Mon, Mar 06, 2017 at 10:59:23AM +0800, Zhang Chen wrote:
> > Qemu need this args to start userspace colo-proxy.
> > 
> > Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
> 
> Acked-by: Wei Liu <wei.liu2@citrix.com>
> 
> > diff --git a/tools/xl/xl_parse.c b/tools/xl/xl_parse.c
> > index 88ef1c6..d2bbe26 100644
> > --- a/tools/xl/xl_parse.c
> > +++ b/tools/xl/xl_parse.c
> > @@ -516,6 +516,33 @@ int parse_nic_config(libxl_device_nic *nic, XLU_Config **config, char *token)
> >          replace_string(&nic->colo_compare_sec_in, oparg);
> >      } else if (MATCH_OPTION("colo_compare_out", token, oparg)) {
> >          replace_string(&nic->colo_compare_out, oparg);
> > +
> 
> Stray blank line -- will try to fix it up while committing.

Actually, removing this will cause rebase error for the next patch. I
will just send another patch to remove this blank line when I get around
to it.

Wei.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH V4 5/8] COLO-Proxy: Add secondary userspace colo-proxy start args
  2017-03-14 11:39     ` Wei Liu
@ 2017-03-15  1:53       ` Zhang Chen
  0 siblings, 0 replies; 24+ messages in thread
From: Zhang Chen @ 2017-03-15  1:53 UTC (permalink / raw)
  To: Wei Liu
  Cc: zhangchen.fnst, Li Zhijian, eddie dong, Ian Jackson,
	Yang Hongyang, Xen devel, Bian Naimeng



On 03/14/2017 07:39 PM, Wei Liu wrote:
> On Tue, Mar 14, 2017 at 11:24:12AM +0000, Wei Liu wrote:
>> On Mon, Mar 06, 2017 at 10:59:23AM +0800, Zhang Chen wrote:
>>> Qemu need this args to start userspace colo-proxy.
>>>
>>> Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
>> Acked-by: Wei Liu <wei.liu2@citrix.com>
>>
>>> diff --git a/tools/xl/xl_parse.c b/tools/xl/xl_parse.c
>>> index 88ef1c6..d2bbe26 100644
>>> --- a/tools/xl/xl_parse.c
>>> +++ b/tools/xl/xl_parse.c
>>> @@ -516,6 +516,33 @@ int parse_nic_config(libxl_device_nic *nic, XLU_Config **config, char *token)
>>>           replace_string(&nic->colo_compare_sec_in, oparg);
>>>       } else if (MATCH_OPTION("colo_compare_out", token, oparg)) {
>>>           replace_string(&nic->colo_compare_out, oparg);
>>> +
>> Stray blank line -- will try to fix it up while committing.
> Actually, removing this will cause rebase error for the next patch. I
> will just send another patch to remove this blank line when I get around
> to it.

Don't need to bother you, I will send a patch for it.

Thanks
Zhang Chen

> Wei.
>
>
> .
>

-- 
Thanks
Zhang Chen




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH V4 7/8] COLO-Proxy: Use socket to get checkpoint event.
  2017-03-14 11:24   ` Wei Liu
@ 2017-03-15  2:02     ` Zhang Chen
  2017-03-15 10:56       ` Wei Liu
  0 siblings, 1 reply; 24+ messages in thread
From: Zhang Chen @ 2017-03-15  2:02 UTC (permalink / raw)
  To: Wei Liu
  Cc: zhangchen.fnst, Li Zhijian, eddie dong, Ian Jackson,
	Yang Hongyang, Xen devel, Bian Naimeng



On 03/14/2017 07:24 PM, Wei Liu wrote:
> On Mon, Mar 06, 2017 at 10:59:25AM +0800, Zhang Chen wrote:
>> We use kernel colo proxy's way to get the checkpoint event
>> from qemu colo-compare.
>> Qemu colo-compare need add a API to support this(I will add this in qemu).
>> Qemu side patch:
>>   https://lists.nongnu.org/archive/html/qemu-devel/2017-02/msg07265.html
>>
>> Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
> Acked-by: Wei Liu <wei.liu2@citrix.com>
>
> But see below.
>
>> @@ -289,8 +393,19 @@ int colo_proxy_checkpoint(libxl__colo_proxy_state *cps,
>>        * event.
>>        */
>>       if (cps->is_userspace_proxy) {
>> -        usleep(timeout_us);
>> -        return 0;
>> +        ret = colo_userspace_proxy_recv(cps, recvbuff, timeout_us);
>> +        if (ret <= 0) {
>> +            ret = 0;
>> +            goto out1;
>> +        }
>> +
>> +        if (!strcmp(recvbuff, "DO_CHECKPOINT")) {
>> +            ret = 1;
>> +        } else {
>> +            LOGD(ERROR, ao->domid, "receive qemu colo-compare checkpoint error");
>> +            ret = 0;
>> +        }
>> +        goto out1;
>>       }
>>   
>>       size = colo_proxy_recv(cps, &buff, timeout_us);
>> @@ -318,4 +433,7 @@ int colo_proxy_checkpoint(libxl__colo_proxy_state *cps,
>>   out:
>>       free(buff);
>>       return ret;
>> +
>> +out1:
> Perhaps try to come up with a better name than out1? Subsequent patch is
> welcome.
>

How about change 'out1' to 'out_userspace_proxy' ?
If OK, I will send a patch for it.

Thanks
Zhang Chen


> .
>

-- 
Thanks
Zhang Chen




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH V4 7/8] COLO-Proxy: Use socket to get checkpoint event.
  2017-03-15  2:02     ` Zhang Chen
@ 2017-03-15 10:56       ` Wei Liu
  2017-03-16  1:21         ` Zhang Chen
  0 siblings, 1 reply; 24+ messages in thread
From: Wei Liu @ 2017-03-15 10:56 UTC (permalink / raw)
  To: Zhang Chen
  Cc: Wei Liu, Li Zhijian, Ian Jackson, eddie dong, Yang Hongyang,
	Xen devel, Bian Naimeng

On Wed, Mar 15, 2017 at 10:02:46AM +0800, Zhang Chen wrote:
> 
> 
> On 03/14/2017 07:24 PM, Wei Liu wrote:
> > On Mon, Mar 06, 2017 at 10:59:25AM +0800, Zhang Chen wrote:
> > > We use kernel colo proxy's way to get the checkpoint event
> > > from qemu colo-compare.
> > > Qemu colo-compare need add a API to support this(I will add this in qemu).
> > > Qemu side patch:
> > >   https://lists.nongnu.org/archive/html/qemu-devel/2017-02/msg07265.html
> > > 
> > > Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
> > Acked-by: Wei Liu <wei.liu2@citrix.com>
> > 
> > But see below.
> > 
> > > @@ -289,8 +393,19 @@ int colo_proxy_checkpoint(libxl__colo_proxy_state *cps,
> > >        * event.
> > >        */
> > >       if (cps->is_userspace_proxy) {
> > > -        usleep(timeout_us);
> > > -        return 0;
> > > +        ret = colo_userspace_proxy_recv(cps, recvbuff, timeout_us);
> > > +        if (ret <= 0) {
> > > +            ret = 0;
> > > +            goto out1;
> > > +        }
> > > +
> > > +        if (!strcmp(recvbuff, "DO_CHECKPOINT")) {
> > > +            ret = 1;
> > > +        } else {
> > > +            LOGD(ERROR, ao->domid, "receive qemu colo-compare checkpoint error");
> > > +            ret = 0;
> > > +        }
> > > +        goto out1;
> > >       }
> > >       size = colo_proxy_recv(cps, &buff, timeout_us);
> > > @@ -318,4 +433,7 @@ int colo_proxy_checkpoint(libxl__colo_proxy_state *cps,
> > >   out:
> > >       free(buff);
> > >       return ret;
> > > +
> > > +out1:
> > Perhaps try to come up with a better name than out1? Subsequent patch is
> > welcome.
> > 
> 
> How about change 'out1' to 'out_userspace_proxy' ?
> If OK, I will send a patch for it.
> 

How about the following patch instead? Compile test only.

In general I would like code to stick with coding style.

--->8---
From 0a87defaad529c02babe24055d5782b74d3a38e3 Mon Sep 17 00:00:00 2001
From: Wei Liu <wei.liu2@citrix.com>
Date: Wed, 15 Mar 2017 10:50:19 +0000
Subject: [PATCH] libxl/colo: unified exit path for colo_proxy_checkpoint

Slightly refactor the code to have only one exit path for the said
function.

Signed-off-by: Wei Liu <wei.liu2@citrix.com>
Cc: zhangchen.fnst@cn.fujitsu.com
---
 tools/libxl/libxl_colo_proxy.c | 15 +++++++--------
 1 file changed, 7 insertions(+), 8 deletions(-)

diff --git a/tools/libxl/libxl_colo_proxy.c b/tools/libxl/libxl_colo_proxy.c
index c3d55104ea..5475f7ea32 100644
--- a/tools/libxl/libxl_colo_proxy.c
+++ b/tools/libxl/libxl_colo_proxy.c
@@ -375,7 +375,7 @@ typedef struct colo_msg {
 int colo_proxy_checkpoint(libxl__colo_proxy_state *cps,
                           unsigned int timeout_us)
 {
-    uint8_t *buff;
+    uint8_t *buff = NULL;
     int64_t size;
     struct nlmsghdr *h;
     struct colo_msg *m;
@@ -396,7 +396,7 @@ int colo_proxy_checkpoint(libxl__colo_proxy_state *cps,
         ret = colo_userspace_proxy_recv(cps, recvbuff, timeout_us);
         if (ret <= 0) {
             ret = 0;
-            goto out1;
+            goto out;
         }
 
         if (!strcmp(recvbuff, "DO_CHECKPOINT")) {
@@ -405,14 +405,16 @@ int colo_proxy_checkpoint(libxl__colo_proxy_state *cps,
             LOGD(ERROR, ao->domid, "receive qemu colo-compare checkpoint error");
             ret = 0;
         }
-        goto out1;
+        goto out;
     }
 
     size = colo_proxy_recv(cps, &buff, timeout_us);
 
     /* timeout, return no checkpoint message. */
-    if (size <= 0)
-        return 0;
+    if (size <= 0) {
+        ret = 0;
+        goto out;
+    }
 
     h = (struct nlmsghdr *) buff;
 
@@ -433,7 +435,4 @@ int colo_proxy_checkpoint(libxl__colo_proxy_state *cps,
 out:
     free(buff);
     return ret;
-
-out1:
-    return ret;
 }
-- 
2.11.0


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* Re: [PATCH V4 7/8] COLO-Proxy: Use socket to get checkpoint event.
  2017-03-15 10:56       ` Wei Liu
@ 2017-03-16  1:21         ` Zhang Chen
  0 siblings, 0 replies; 24+ messages in thread
From: Zhang Chen @ 2017-03-16  1:21 UTC (permalink / raw)
  To: Wei Liu
  Cc: zhangchen.fnst, Li Zhijian, eddie dong, Ian Jackson,
	Yang Hongyang, Xen devel, Bian Naimeng



On 03/15/2017 06:56 PM, Wei Liu wrote:
> On Wed, Mar 15, 2017 at 10:02:46AM +0800, Zhang Chen wrote:
>>
>> On 03/14/2017 07:24 PM, Wei Liu wrote:
>>> On Mon, Mar 06, 2017 at 10:59:25AM +0800, Zhang Chen wrote:
>>>> We use kernel colo proxy's way to get the checkpoint event
>>>> from qemu colo-compare.
>>>> Qemu colo-compare need add a API to support this(I will add this in qemu).
>>>> Qemu side patch:
>>>>    https://lists.nongnu.org/archive/html/qemu-devel/2017-02/msg07265.html
>>>>
>>>> Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
>>> Acked-by: Wei Liu <wei.liu2@citrix.com>
>>>
>>> But see below.
>>>
>>>> @@ -289,8 +393,19 @@ int colo_proxy_checkpoint(libxl__colo_proxy_state *cps,
>>>>         * event.
>>>>         */
>>>>        if (cps->is_userspace_proxy) {
>>>> -        usleep(timeout_us);
>>>> -        return 0;
>>>> +        ret = colo_userspace_proxy_recv(cps, recvbuff, timeout_us);
>>>> +        if (ret <= 0) {
>>>> +            ret = 0;
>>>> +            goto out1;
>>>> +        }
>>>> +
>>>> +        if (!strcmp(recvbuff, "DO_CHECKPOINT")) {
>>>> +            ret = 1;
>>>> +        } else {
>>>> +            LOGD(ERROR, ao->domid, "receive qemu colo-compare checkpoint error");
>>>> +            ret = 0;
>>>> +        }
>>>> +        goto out1;
>>>>        }
>>>>        size = colo_proxy_recv(cps, &buff, timeout_us);
>>>> @@ -318,4 +433,7 @@ int colo_proxy_checkpoint(libxl__colo_proxy_state *cps,
>>>>    out:
>>>>        free(buff);
>>>>        return ret;
>>>> +
>>>> +out1:
>>> Perhaps try to come up with a better name than out1? Subsequent patch is
>>> welcome.
>>>
>> How about change 'out1' to 'out_userspace_proxy' ?
>> If OK, I will send a patch for it.
>>
> How about the following patch instead? Compile test only.
>
> In general I would like code to stick with coding style.
>
> --->8---
> >From 0a87defaad529c02babe24055d5782b74d3a38e3 Mon Sep 17 00:00:00 2001
> From: Wei Liu <wei.liu2@citrix.com>
> Date: Wed, 15 Mar 2017 10:50:19 +0000
> Subject: [PATCH] libxl/colo: unified exit path for colo_proxy_checkpoint
>
> Slightly refactor the code to have only one exit path for the said
> function.
>
> Signed-off-by: Wei Liu <wei.liu2@citrix.com>

Acked-by: Zhang Chen<zhangchen.fnst@cn.fujitsu.com>

Thanks
Zhang Chen


> Cc: zhangchen.fnst@cn.fujitsu.com
> ---
>   tools/libxl/libxl_colo_proxy.c | 15 +++++++--------
>   1 file changed, 7 insertions(+), 8 deletions(-)
>
> diff --git a/tools/libxl/libxl_colo_proxy.c b/tools/libxl/libxl_colo_proxy.c
> index c3d55104ea..5475f7ea32 100644
> --- a/tools/libxl/libxl_colo_proxy.c
> +++ b/tools/libxl/libxl_colo_proxy.c
> @@ -375,7 +375,7 @@ typedef struct colo_msg {
>   int colo_proxy_checkpoint(libxl__colo_proxy_state *cps,
>                             unsigned int timeout_us)
>   {
> -    uint8_t *buff;
> +    uint8_t *buff = NULL;
>       int64_t size;
>       struct nlmsghdr *h;
>       struct colo_msg *m;
> @@ -396,7 +396,7 @@ int colo_proxy_checkpoint(libxl__colo_proxy_state *cps,
>           ret = colo_userspace_proxy_recv(cps, recvbuff, timeout_us);
>           if (ret <= 0) {
>               ret = 0;
> -            goto out1;
> +            goto out;
>           }
>   
>           if (!strcmp(recvbuff, "DO_CHECKPOINT")) {
> @@ -405,14 +405,16 @@ int colo_proxy_checkpoint(libxl__colo_proxy_state *cps,
>               LOGD(ERROR, ao->domid, "receive qemu colo-compare checkpoint error");
>               ret = 0;
>           }
> -        goto out1;
> +        goto out;
>       }
>   
>       size = colo_proxy_recv(cps, &buff, timeout_us);
>   
>       /* timeout, return no checkpoint message. */
> -    if (size <= 0)
> -        return 0;
> +    if (size <= 0) {
> +        ret = 0;
> +        goto out;
> +    }
>   
>       h = (struct nlmsghdr *) buff;
>   
> @@ -433,7 +435,4 @@ int colo_proxy_checkpoint(libxl__colo_proxy_state *cps,
>   out:
>       free(buff);
>       return ret;
> -
> -out1:
> -    return ret;
>   }

-- 
Thanks
Zhang Chen




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 24+ messages in thread

end of thread, other threads:[~2017-03-16  1:27 UTC | newest]

Thread overview: 24+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-03-06  2:59 [PATCH V4 0/8] COLO-Proxy: Make Xen COLO use userspace colo-proxy Zhang Chen
2017-03-06  2:59 ` [PATCH V4 1/8] COLO-Proxy: Add remus command to open userspace proxy Zhang Chen
2017-03-14 11:23   ` Wei Liu
2017-03-06  2:59 ` [PATCH V4 2/8] COLO-Proxy: Setup userspace colo-proxy on primary side Zhang Chen
2017-03-14 11:24   ` Wei Liu
2017-03-06  2:59 ` [PATCH V4 3/8] COLO-Proxy: Setup userspace colo-proxy on secondary side Zhang Chen
2017-03-14 11:24   ` Wei Liu
2017-03-06  2:59 ` [PATCH V4 4/8] COLO-Proxy: Add primary userspace colo proxy start args Zhang Chen
2017-03-14 11:24   ` Wei Liu
2017-03-06  2:59 ` [PATCH V4 5/8] COLO-Proxy: Add secondary userspace colo-proxy " Zhang Chen
2017-03-14 11:24   ` Wei Liu
2017-03-14 11:39     ` Wei Liu
2017-03-15  1:53       ` Zhang Chen
2017-03-06  2:59 ` [PATCH V4 6/8] COLO-Proxy: Add colo-compare notify args Zhang Chen
2017-03-14 11:24   ` Wei Liu
2017-03-06  2:59 ` [PATCH V4 7/8] COLO-Proxy: Use socket to get checkpoint event Zhang Chen
2017-03-14 11:24   ` Wei Liu
2017-03-15  2:02     ` Zhang Chen
2017-03-15 10:56       ` Wei Liu
2017-03-16  1:21         ` Zhang Chen
2017-03-06  2:59 ` [PATCH V4 8/8] COLO-proxy: Add colo_userspace_proxy macro Zhang Chen
2017-03-14 11:24   ` Wei Liu
2017-03-06 14:31 ` [PATCH V4 0/8] COLO-Proxy: Make Xen COLO use userspace colo-proxy Konrad Rzeszutek Wilk
2017-03-07  3:25   ` Zhang Chen

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.