qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v3 For-1.6 0/7] rdma: bugfixes, cleanups, IPv6 support
@ 2013-08-04  2:54 mrhines
  2013-08-04  2:54 ` [Qemu-devel] [PATCH v3 For-1.6 1/7] rdma: bugfix: make IPv6 support work mrhines
                   ` (7 more replies)
  0 siblings, 8 replies; 13+ messages in thread
From: mrhines @ 2013-08-04  2:54 UTC (permalink / raw)
  To: qemu-devel; +Cc: yamahata, aliguori, quintela, owasserm, mrhines, pbonzini

From: "Michael R. Hines" <mrhines@us.ibm.com>

Changes:

A few bug
1. IPv6 support was broken under libvirt.
2. incorrect use of error_setg()
3. DPRINTF flag was not disabled
4. Numerous other bugfixes.

Isaku Yamahata (4):
  rdma: don't use negative index to array
  rdma: qemu_rdma_post_send_control uses wrongly RDMA_WRID_MAX
  rdma: use RDMA_WRID_READY
  rdma: memory leak RDMAContext::host

Michael R. Hines (3):
  rdma: bugfix: make IPv6 support work
  rdma: forgot to turn off the debugging flag
  rdma: correct newlines in error statements

 migration-rdma.c |  144 ++++++++++++++++++++++++++++++------------------------
 1 file changed, 79 insertions(+), 65 deletions(-)

-- 
1.7.10.4

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

* [Qemu-devel] [PATCH v3 For-1.6 1/7] rdma: bugfix: make IPv6 support work
  2013-08-04  2:54 [Qemu-devel] [PATCH v3 For-1.6 0/7] rdma: bugfixes, cleanups, IPv6 support mrhines
@ 2013-08-04  2:54 ` mrhines
  2013-08-07  8:39   ` Orit Wasserman
  2013-08-04  2:54 ` [Qemu-devel] [PATCH v3 For-1.6 2/7] rdma: forgot to turn off the debugging flag mrhines
                   ` (6 subsequent siblings)
  7 siblings, 1 reply; 13+ messages in thread
From: mrhines @ 2013-08-04  2:54 UTC (permalink / raw)
  To: qemu-devel; +Cc: yamahata, aliguori, quintela, owasserm, mrhines, pbonzini

From: "Michael R. Hines" <mrhines@us.ibm.com>

RDMA does not use sockets, so we cannot use many of the socket
helper functions, but we *do* use inet_parse() which gives
RDMA all the necessary details of the connection parameters.

However, when testing with libvirt, a simple IPv6 migration test failed
because we were not using getaddrinfo() properly.

This makes IPv6 migration over RDMA work.

Signed-off-by: Michael R. Hines <mrhines@us.ibm.com>
---
 migration-rdma.c |   33 +++++++++++++++++++++------------
 1 file changed, 21 insertions(+), 12 deletions(-)

diff --git a/migration-rdma.c b/migration-rdma.c
index d044830..9cf73e3 100644
--- a/migration-rdma.c
+++ b/migration-rdma.c
@@ -392,6 +392,7 @@ typedef struct RDMAContext {
     uint64_t unregistrations[RDMA_SIGNALED_SEND_MAX];
 
     GHashTable *blockmap;
+    bool ipv6;
 } RDMAContext;
 
 /*
@@ -744,6 +745,7 @@ static int qemu_rdma_resolve_host(RDMAContext *rdma, Error **errp)
     char port_str[16];
     struct rdma_cm_event *cm_event;
     char ip[40] = "unknown";
+    int af = rdma->ipv6 ? PF_INET6 : PF_INET;
 
     if (rdma->host == NULL || !strcmp(rdma->host, "")) {
         ERROR(errp, "RDMA hostname has not been set\n");
@@ -773,7 +775,7 @@ static int qemu_rdma_resolve_host(RDMAContext *rdma, Error **errp)
         goto err_resolve_get_addr;
     }
 
-    inet_ntop(AF_INET, &((struct sockaddr_in *) res->ai_addr)->sin_addr,
+    inet_ntop(af, &((struct sockaddr_in *) res->ai_addr)->sin_addr,
                                 ip, sizeof ip);
     DPRINTF("%s => %s\n", rdma->host, ip);
 
@@ -2236,9 +2238,12 @@ err_rdma_source_connect:
 static int qemu_rdma_dest_init(RDMAContext *rdma, Error **errp)
 {
     int ret = -EINVAL, idx;
+    int af = rdma->ipv6 ? PF_INET6 : PF_INET;
     struct sockaddr_in sin;
     struct rdma_cm_id *listen_id;
     char ip[40] = "unknown";
+    struct addrinfo *res;
+    char port_str[16];
 
     for (idx = 0; idx <= RDMA_WRID_MAX; idx++) {
         rdma->wr_data[idx].control_len = 0;
@@ -2266,27 +2271,30 @@ static int qemu_rdma_dest_init(RDMAContext *rdma, Error **errp)
     }
 
     memset(&sin, 0, sizeof(sin));
-    sin.sin_family = AF_INET;
+    sin.sin_family = af;
     sin.sin_port = htons(rdma->port);
+    snprintf(port_str, 16, "%d", rdma->port);
+    port_str[15] = '\0';
 
     if (rdma->host && strcmp("", rdma->host)) {
-        struct hostent *dest_addr;
-        dest_addr = gethostbyname(rdma->host);
-        if (!dest_addr) {
-            ERROR(errp, "migration could not gethostbyname!\n");
-            ret = -EINVAL;
+        ret = getaddrinfo(rdma->host, port_str, NULL, &res);
+        if (ret < 0) {
+            ERROR(errp, "could not getaddrinfo address %s\n", rdma->host);
             goto err_dest_init_bind_addr;
         }
-        memcpy(&sin.sin_addr.s_addr, dest_addr->h_addr,
-                dest_addr->h_length);
-        inet_ntop(AF_INET, dest_addr->h_addr, ip, sizeof ip);
+
+
+        inet_ntop(af, &((struct sockaddr_in *) res->ai_addr)->sin_addr,
+                                    ip, sizeof ip);
     } else {
-        sin.sin_addr.s_addr = INADDR_ANY;
+        ERROR(errp, "migration host and port not specified!\n");
+        ret = -EINVAL;
+        goto err_dest_init_bind_addr;
     }
 
     DPRINTF("%s => %s\n", rdma->host, ip);
 
-    ret = rdma_bind_addr(listen_id, (struct sockaddr *)&sin);
+    ret = rdma_bind_addr(listen_id, res->ai_addr);
     if (ret) {
         ERROR(errp, "Error: could not rdma_bind_addr!\n");
         goto err_dest_init_bind_addr;
@@ -2321,6 +2329,7 @@ static void *qemu_rdma_data_init(const char *host_port, Error **errp)
         if (addr != NULL) {
             rdma->port = atoi(addr->port);
             rdma->host = g_strdup(addr->host);
+            rdma->ipv6 = addr->ipv6;
         } else {
             ERROR(errp, "bad RDMA migration address '%s'", host_port);
             g_free(rdma);
-- 
1.7.10.4

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

* [Qemu-devel] [PATCH v3 For-1.6 2/7] rdma: forgot to turn off the debugging flag
  2013-08-04  2:54 [Qemu-devel] [PATCH v3 For-1.6 0/7] rdma: bugfixes, cleanups, IPv6 support mrhines
  2013-08-04  2:54 ` [Qemu-devel] [PATCH v3 For-1.6 1/7] rdma: bugfix: make IPv6 support work mrhines
@ 2013-08-04  2:54 ` mrhines
  2013-08-07  8:39   ` Orit Wasserman
  2013-08-04  2:54 ` [Qemu-devel] [PATCH v3 For-1.6 3/7] rdma: correct newlines in error statements mrhines
                   ` (5 subsequent siblings)
  7 siblings, 1 reply; 13+ messages in thread
From: mrhines @ 2013-08-04  2:54 UTC (permalink / raw)
  To: qemu-devel; +Cc: yamahata, aliguori, quintela, owasserm, mrhines, pbonzini

From: "Michael R. Hines" <mrhines@us.ibm.com>

Ooops. We forgot to turn off the flag.

Signed-off-by: Michael R. Hines <mrhines@us.ibm.com>
---
 migration-rdma.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/migration-rdma.c b/migration-rdma.c
index 9cf73e3..fe6118d 100644
--- a/migration-rdma.c
+++ b/migration-rdma.c
@@ -27,7 +27,7 @@
 #include <string.h>
 #include <rdma/rdma_cma.h>
 
-#define DEBUG_RDMA
+//#define DEBUG_RDMA
 //#define DEBUG_RDMA_VERBOSE
 //#define DEBUG_RDMA_REALLY_VERBOSE
 
-- 
1.7.10.4

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

* [Qemu-devel] [PATCH v3 For-1.6 3/7] rdma: correct newlines in error statements
  2013-08-04  2:54 [Qemu-devel] [PATCH v3 For-1.6 0/7] rdma: bugfixes, cleanups, IPv6 support mrhines
  2013-08-04  2:54 ` [Qemu-devel] [PATCH v3 For-1.6 1/7] rdma: bugfix: make IPv6 support work mrhines
  2013-08-04  2:54 ` [Qemu-devel] [PATCH v3 For-1.6 2/7] rdma: forgot to turn off the debugging flag mrhines
@ 2013-08-04  2:54 ` mrhines
  2013-08-07  8:45   ` Orit Wasserman
  2013-08-04  2:54 ` [Qemu-devel] [PATCH v3 For-1.6 4/7] rdma: don't use negative index to array mrhines
                   ` (4 subsequent siblings)
  7 siblings, 1 reply; 13+ messages in thread
From: mrhines @ 2013-08-04  2:54 UTC (permalink / raw)
  To: qemu-devel; +Cc: yamahata, aliguori, quintela, owasserm, mrhines, pbonzini

From: "Michael R. Hines" <mrhines@us.ibm.com>

Don't print newlines on the error_setg() function,
but still allow newlines on fprintf().

Signed-off-by: Michael R. Hines <mrhines@us.ibm.com>
---
 migration-rdma.c |   68 +++++++++++++++++++++++++++---------------------------
 1 file changed, 34 insertions(+), 34 deletions(-)

diff --git a/migration-rdma.c b/migration-rdma.c
index fe6118d..c958e5f 100644
--- a/migration-rdma.c
+++ b/migration-rdma.c
@@ -60,7 +60,7 @@
  */
 #define ERROR(errp, fmt, ...) \
     do { \
-        fprintf(stderr, "RDMA ERROR: " fmt, ## __VA_ARGS__); \
+        fprintf(stderr, "RDMA ERROR: " fmt "\n", ## __VA_ARGS__); \
         if (errp && (*(errp) == NULL)) { \
             error_setg(errp, "RDMA ERROR: " fmt, ## __VA_ARGS__); \
         } \
@@ -748,21 +748,21 @@ static int qemu_rdma_resolve_host(RDMAContext *rdma, Error **errp)
     int af = rdma->ipv6 ? PF_INET6 : PF_INET;
 
     if (rdma->host == NULL || !strcmp(rdma->host, "")) {
-        ERROR(errp, "RDMA hostname has not been set\n");
+        ERROR(errp, "RDMA hostname has not been set");
         return -1;
     }
 
     /* create CM channel */
     rdma->channel = rdma_create_event_channel();
     if (!rdma->channel) {
-        ERROR(errp, "could not create CM channel\n");
+        ERROR(errp, "could not create CM channel");
         return -1;
     }
 
     /* create CM id */
     ret = rdma_create_id(rdma->channel, &rdma->cm_id, NULL, RDMA_PS_TCP);
     if (ret) {
-        ERROR(errp, "could not create channel id\n");
+        ERROR(errp, "could not create channel id");
         goto err_resolve_create_id;
     }
 
@@ -771,7 +771,7 @@ static int qemu_rdma_resolve_host(RDMAContext *rdma, Error **errp)
 
     ret = getaddrinfo(rdma->host, port_str, NULL, &res);
     if (ret < 0) {
-        ERROR(errp, "could not getaddrinfo address %s\n", rdma->host);
+        ERROR(errp, "could not getaddrinfo address %s", rdma->host);
         goto err_resolve_get_addr;
     }
 
@@ -783,7 +783,7 @@ static int qemu_rdma_resolve_host(RDMAContext *rdma, Error **errp)
     ret = rdma_resolve_addr(rdma->cm_id, NULL, res->ai_addr,
             RDMA_RESOLVE_TIMEOUT_MS);
     if (ret) {
-        ERROR(errp, "could not resolve address %s\n", rdma->host);
+        ERROR(errp, "could not resolve address %s", rdma->host);
         goto err_resolve_get_addr;
     }
 
@@ -791,12 +791,12 @@ static int qemu_rdma_resolve_host(RDMAContext *rdma, Error **errp)
 
     ret = rdma_get_cm_event(rdma->channel, &cm_event);
     if (ret) {
-        ERROR(errp, "could not perform event_addr_resolved\n");
+        ERROR(errp, "could not perform event_addr_resolved");
         goto err_resolve_get_addr;
     }
 
     if (cm_event->event != RDMA_CM_EVENT_ADDR_RESOLVED) {
-        ERROR(errp, "result not equal to event_addr_resolved %s\n",
+        ERROR(errp, "result not equal to event_addr_resolved %s",
                 rdma_event_str(cm_event->event));
         perror("rdma_resolve_addr");
         goto err_resolve_get_addr;
@@ -806,17 +806,17 @@ static int qemu_rdma_resolve_host(RDMAContext *rdma, Error **errp)
     /* resolve route */
     ret = rdma_resolve_route(rdma->cm_id, RDMA_RESOLVE_TIMEOUT_MS);
     if (ret) {
-        ERROR(errp, "could not resolve rdma route\n");
+        ERROR(errp, "could not resolve rdma route");
         goto err_resolve_get_addr;
     }
 
     ret = rdma_get_cm_event(rdma->channel, &cm_event);
     if (ret) {
-        ERROR(errp, "could not perform event_route_resolved\n");
+        ERROR(errp, "could not perform event_route_resolved");
         goto err_resolve_get_addr;
     }
     if (cm_event->event != RDMA_CM_EVENT_ROUTE_RESOLVED) {
-        ERROR(errp, "result not equal to event_route_resolved: %s\n",
+        ERROR(errp, "result not equal to event_route_resolved: %s",
                         rdma_event_str(cm_event->event));
         rdma_ack_cm_event(cm_event);
         goto err_resolve_get_addr;
@@ -2117,26 +2117,26 @@ static int qemu_rdma_source_init(RDMAContext *rdma, Error **errp, bool pin_all)
     if (ret) {
         ERROR(temp, "rdma migration: error allocating pd and cq! Your mlock()"
                     " limits may be too low. Please check $ ulimit -a # and "
-                    "search for 'ulimit -l' in the output\n");
+                    "search for 'ulimit -l' in the output");
         goto err_rdma_source_init;
     }
 
     ret = qemu_rdma_alloc_qp(rdma);
     if (ret) {
-        ERROR(temp, "rdma migration: error allocating qp!\n");
+        ERROR(temp, "rdma migration: error allocating qp!");
         goto err_rdma_source_init;
     }
 
     ret = qemu_rdma_init_ram_blocks(rdma);
     if (ret) {
-        ERROR(temp, "rdma migration: error initializing ram blocks!\n");
+        ERROR(temp, "rdma migration: error initializing ram blocks!");
         goto err_rdma_source_init;
     }
 
     for (idx = 0; idx <= RDMA_WRID_MAX; idx++) {
         ret = qemu_rdma_reg_control(rdma, idx);
         if (ret) {
-            ERROR(temp, "rdma migration: error registering %d control!\n",
+            ERROR(temp, "rdma migration: error registering %d control!",
                                                             idx);
             goto err_rdma_source_init;
         }
@@ -2178,7 +2178,7 @@ static int qemu_rdma_connect(RDMAContext *rdma, Error **errp)
     ret = rdma_connect(rdma->cm_id, &conn_param);
     if (ret) {
         perror("rdma_connect");
-        ERROR(errp, "connecting to destination!\n");
+        ERROR(errp, "connecting to destination!");
         rdma_destroy_id(rdma->cm_id);
         rdma->cm_id = NULL;
         goto err_rdma_source_connect;
@@ -2187,7 +2187,7 @@ static int qemu_rdma_connect(RDMAContext *rdma, Error **errp)
     ret = rdma_get_cm_event(rdma->channel, &cm_event);
     if (ret) {
         perror("rdma_get_cm_event after rdma_connect");
-        ERROR(errp, "connecting to destination!\n");
+        ERROR(errp, "connecting to destination!");
         rdma_ack_cm_event(cm_event);
         rdma_destroy_id(rdma->cm_id);
         rdma->cm_id = NULL;
@@ -2196,7 +2196,7 @@ static int qemu_rdma_connect(RDMAContext *rdma, Error **errp)
 
     if (cm_event->event != RDMA_CM_EVENT_ESTABLISHED) {
         perror("rdma_get_cm_event != EVENT_ESTABLISHED after rdma_connect");
-        ERROR(errp, "connecting to destination!\n");
+        ERROR(errp, "connecting to destination!");
         rdma_ack_cm_event(cm_event);
         rdma_destroy_id(rdma->cm_id);
         rdma->cm_id = NULL;
@@ -2212,7 +2212,7 @@ static int qemu_rdma_connect(RDMAContext *rdma, Error **errp)
      */
     if (rdma->pin_all && !(cap.flags & RDMA_CAPABILITY_PIN_ALL)) {
         ERROR(errp, "Server cannot support pinning all memory. "
-                        "Will register memory dynamically.\n");
+                        "Will register memory dynamically.");
         rdma->pin_all = false;
     }
 
@@ -2222,7 +2222,7 @@ static int qemu_rdma_connect(RDMAContext *rdma, Error **errp)
 
     ret = qemu_rdma_post_recv_control(rdma, 0);
     if (ret) {
-        ERROR(errp, "posting second control recv!\n");
+        ERROR(errp, "posting second control recv!");
         goto err_rdma_source_connect;
     }
 
@@ -2251,14 +2251,14 @@ static int qemu_rdma_dest_init(RDMAContext *rdma, Error **errp)
     }
 
     if (rdma->host == NULL) {
-        ERROR(errp, "RDMA host is not set!\n");
+        ERROR(errp, "RDMA host is not set!");
         rdma->error_state = -EINVAL;
         return -1;
     }
     /* create CM channel */
     rdma->channel = rdma_create_event_channel();
     if (!rdma->channel) {
-        ERROR(errp, "could not create rdma event channel\n");
+        ERROR(errp, "could not create rdma event channel");
         rdma->error_state = -EINVAL;
         return -1;
     }
@@ -2266,7 +2266,7 @@ static int qemu_rdma_dest_init(RDMAContext *rdma, Error **errp)
     /* create CM id */
     ret = rdma_create_id(rdma->channel, &listen_id, NULL, RDMA_PS_TCP);
     if (ret) {
-        ERROR(errp, "could not create cm_id!\n");
+        ERROR(errp, "could not create cm_id!");
         goto err_dest_init_create_listen_id;
     }
 
@@ -2279,7 +2279,7 @@ static int qemu_rdma_dest_init(RDMAContext *rdma, Error **errp)
     if (rdma->host && strcmp("", rdma->host)) {
         ret = getaddrinfo(rdma->host, port_str, NULL, &res);
         if (ret < 0) {
-            ERROR(errp, "could not getaddrinfo address %s\n", rdma->host);
+            ERROR(errp, "could not getaddrinfo address %s", rdma->host);
             goto err_dest_init_bind_addr;
         }
 
@@ -2287,7 +2287,7 @@ static int qemu_rdma_dest_init(RDMAContext *rdma, Error **errp)
         inet_ntop(af, &((struct sockaddr_in *) res->ai_addr)->sin_addr,
                                     ip, sizeof ip);
     } else {
-        ERROR(errp, "migration host and port not specified!\n");
+        ERROR(errp, "migration host and port not specified!");
         ret = -EINVAL;
         goto err_dest_init_bind_addr;
     }
@@ -2296,7 +2296,7 @@ static int qemu_rdma_dest_init(RDMAContext *rdma, Error **errp)
 
     ret = rdma_bind_addr(listen_id, res->ai_addr);
     if (ret) {
-        ERROR(errp, "Error: could not rdma_bind_addr!\n");
+        ERROR(errp, "Error: could not rdma_bind_addr!");
         goto err_dest_init_bind_addr;
     }
 
@@ -3036,7 +3036,7 @@ static int qemu_rdma_registration_stop(QEMUFile *f, void *opaque,
                     &reg_result_idx, rdma->pin_all ?
                     qemu_rdma_reg_whole_ram_blocks : NULL);
         if (ret < 0) {
-            ERROR(errp, "receiving remote info!\n");
+            ERROR(errp, "receiving remote info!");
             return ret;
         }
 
@@ -3061,7 +3061,7 @@ static int qemu_rdma_registration_stop(QEMUFile *f, void *opaque,
         if (local->nb_blocks != nb_remote_blocks) {
             ERROR(errp, "ram blocks mismatch #1! "
                         "Your QEMU command line parameters are probably "
-                        "not identical on both the source and destination.\n");
+                        "not identical on both the source and destination.");
             return -EINVAL;
         }
 
@@ -3077,7 +3077,7 @@ static int qemu_rdma_registration_stop(QEMUFile *f, void *opaque,
                 if (rdma->block[i].length != local->block[j].length) {
                     ERROR(errp, "ram blocks mismatch #2! "
                         "Your QEMU command line parameters are probably "
-                        "not identical on both the source and destination.\n");
+                        "not identical on both the source and destination.");
                     return -EINVAL;
                 }
                 local->block[j].remote_host_addr =
@@ -3089,7 +3089,7 @@ static int qemu_rdma_registration_stop(QEMUFile *f, void *opaque,
             if (j >= local->nb_blocks) {
                 ERROR(errp, "ram blocks mismatch #3! "
                         "Your QEMU command line parameters are probably "
-                        "not identical on both the source and destination.\n");
+                        "not identical on both the source and destination.");
                 return -EINVAL;
             }
         }
@@ -3163,7 +3163,7 @@ static void rdma_accept_incoming_migration(void *opaque)
     ret = qemu_rdma_accept(rdma);
 
     if (ret) {
-        ERROR(errp, "RDMA Migration initialization failed!\n");
+        ERROR(errp, "RDMA Migration initialization failed!");
         return;
     }
 
@@ -3171,7 +3171,7 @@ static void rdma_accept_incoming_migration(void *opaque)
 
     f = qemu_fopen_rdma(rdma, "rb");
     if (f == NULL) {
-        ERROR(errp, "could not qemu_fopen_rdma!\n");
+        ERROR(errp, "could not qemu_fopen_rdma!");
         qemu_rdma_cleanup(rdma);
         return;
     }
@@ -3204,7 +3204,7 @@ void rdma_start_incoming_migration(const char *host_port, Error **errp)
     ret = rdma_listen(rdma->listen_id, 5);
 
     if (ret) {
-        ERROR(errp, "listening on socket!\n");
+        ERROR(errp, "listening on socket!");
         goto err;
     }
 
@@ -3228,7 +3228,7 @@ void rdma_start_outgoing_migration(void *opaque,
     int ret = 0;
 
     if (rdma == NULL) {
-        ERROR(temp, "Failed to initialize RDMA data structures! %d\n", ret);
+        ERROR(temp, "Failed to initialize RDMA data structures! %d", ret);
         goto err;
     }
 
-- 
1.7.10.4

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

* [Qemu-devel] [PATCH v3 For-1.6 4/7] rdma: don't use negative index to array
  2013-08-04  2:54 [Qemu-devel] [PATCH v3 For-1.6 0/7] rdma: bugfixes, cleanups, IPv6 support mrhines
                   ` (2 preceding siblings ...)
  2013-08-04  2:54 ` [Qemu-devel] [PATCH v3 For-1.6 3/7] rdma: correct newlines in error statements mrhines
@ 2013-08-04  2:54 ` mrhines
  2013-08-04  2:54 ` [Qemu-devel] [PATCH v3 For-1.6 5/7] rdma: qemu_rdma_post_send_control uses wrongly RDMA_WRID_MAX mrhines
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 13+ messages in thread
From: mrhines @ 2013-08-04  2:54 UTC (permalink / raw)
  To: qemu-devel; +Cc: yamahata, aliguori, quintela, owasserm, mrhines, pbonzini

From: Isaku Yamahata <yamahata@private.email.ne.jp>

Reviewed-by: Michael R. Hines <mrhines@us.ibm.com>
Signed-off-by: Isaku Yamahata <yamahata@private.email.ne.jp>
Signed-off-by: Michael R. Hines <mrhines@us.ibm.com>
---
 migration-rdma.c |   27 +++++++++++++++------------
 1 file changed, 15 insertions(+), 12 deletions(-)

diff --git a/migration-rdma.c b/migration-rdma.c
index c958e5f..7266803 100644
--- a/migration-rdma.c
+++ b/migration-rdma.c
@@ -1933,10 +1933,21 @@ static int qemu_rdma_write_flush(QEMUFile *f, RDMAContext *rdma)
 static inline int qemu_rdma_buffer_mergable(RDMAContext *rdma,
                     uint64_t offset, uint64_t len)
 {
-    RDMALocalBlock *block =
-        &(rdma->local_ram_blocks.block[rdma->current_index]);
-    uint8_t *host_addr = block->local_host_addr + (offset - block->offset);
-    uint8_t *chunk_end = ram_chunk_end(block, rdma->current_chunk);
+    RDMALocalBlock *block;
+    uint8_t *host_addr;
+    uint8_t *chunk_end;
+
+    if (rdma->current_index < 0) {
+        return 0;
+    }
+
+    if (rdma->current_chunk < 0) {
+        return 0;
+    }
+
+    block = &(rdma->local_ram_blocks.block[rdma->current_index]);
+    host_addr = block->local_host_addr + (offset - block->offset);
+    chunk_end = ram_chunk_end(block, rdma->current_chunk);
 
     if (rdma->current_length == 0) {
         return 0;
@@ -1949,10 +1960,6 @@ static inline int qemu_rdma_buffer_mergable(RDMAContext *rdma,
         return 0;
     }
 
-    if (rdma->current_index < 0) {
-        return 0;
-    }
-
     if (offset < block->offset) {
         return 0;
     }
@@ -1961,10 +1968,6 @@ static inline int qemu_rdma_buffer_mergable(RDMAContext *rdma,
         return 0;
     }
 
-    if (rdma->current_chunk < 0) {
-        return 0;
-    }
-
     if ((host_addr + len) > chunk_end) {
         return 0;
     }
-- 
1.7.10.4

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

* [Qemu-devel] [PATCH v3 For-1.6 5/7] rdma: qemu_rdma_post_send_control uses wrongly RDMA_WRID_MAX
  2013-08-04  2:54 [Qemu-devel] [PATCH v3 For-1.6 0/7] rdma: bugfixes, cleanups, IPv6 support mrhines
                   ` (3 preceding siblings ...)
  2013-08-04  2:54 ` [Qemu-devel] [PATCH v3 For-1.6 4/7] rdma: don't use negative index to array mrhines
@ 2013-08-04  2:54 ` mrhines
  2013-08-04  2:54 ` [Qemu-devel] [PATCH v3 For-1.6 6/7] rdma: use RDMA_WRID_READY mrhines
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 13+ messages in thread
From: mrhines @ 2013-08-04  2:54 UTC (permalink / raw)
  To: qemu-devel; +Cc: yamahata, aliguori, quintela, owasserm, mrhines, pbonzini

From: Isaku Yamahata <yamahata@private.email.ne.jp>

RDMA_WRID_CONTROL should be used. And remove related work around.

Reviewed-by: Michael R. Hines <mrhines@us.ibm.com>
Signed-off-by: Isaku Yamahata <yamahata@private.email.ne.jp>
Signed-off-by: Michael R. Hines <mrhines@us.ibm.com>
---
 migration-rdma.c |   12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/migration-rdma.c b/migration-rdma.c
index 7266803..ea16f0e 100644
--- a/migration-rdma.c
+++ b/migration-rdma.c
@@ -322,7 +322,7 @@ typedef struct RDMAContext {
     char *host;
     int port;
 
-    RDMAWorkRequestData wr_data[RDMA_WRID_MAX + 1];
+    RDMAWorkRequestData wr_data[RDMA_WRID_MAX];
 
     /*
      * This is used by *_exchange_send() to figure out whether or not
@@ -1399,7 +1399,7 @@ static int qemu_rdma_post_send_control(RDMAContext *rdma, uint8_t *buf,
                                        RDMAControlHeader *head)
 {
     int ret = 0;
-    RDMAWorkRequestData *wr = &rdma->wr_data[RDMA_WRID_MAX];
+    RDMAWorkRequestData *wr = &rdma->wr_data[RDMA_WRID_CONTROL];
     struct ibv_send_wr *bad_wr;
     struct ibv_sge sge = {
                            .addr = (uint64_t)(wr->control),
@@ -2054,7 +2054,7 @@ static void qemu_rdma_cleanup(RDMAContext *rdma)
     g_free(rdma->block);
     rdma->block = NULL;
 
-    for (idx = 0; idx <= RDMA_WRID_MAX; idx++) {
+    for (idx = 0; idx < RDMA_WRID_MAX; idx++) {
         if (rdma->wr_data[idx].control_mr) {
             rdma->total_registrations--;
             ibv_dereg_mr(rdma->wr_data[idx].control_mr);
@@ -2136,7 +2136,7 @@ static int qemu_rdma_source_init(RDMAContext *rdma, Error **errp, bool pin_all)
         goto err_rdma_source_init;
     }
 
-    for (idx = 0; idx <= RDMA_WRID_MAX; idx++) {
+    for (idx = 0; idx < RDMA_WRID_MAX; idx++) {
         ret = qemu_rdma_reg_control(rdma, idx);
         if (ret) {
             ERROR(temp, "rdma migration: error registering %d control!",
@@ -2248,7 +2248,7 @@ static int qemu_rdma_dest_init(RDMAContext *rdma, Error **errp)
     struct addrinfo *res;
     char port_str[16];
 
-    for (idx = 0; idx <= RDMA_WRID_MAX; idx++) {
+    for (idx = 0; idx < RDMA_WRID_MAX; idx++) {
         rdma->wr_data[idx].control_len = 0;
         rdma->wr_data[idx].control_curr = NULL;
     }
@@ -2705,7 +2705,7 @@ static int qemu_rdma_accept(RDMAContext *rdma)
         goto err_rdma_dest_wait;
     }
 
-    for (idx = 0; idx <= RDMA_WRID_MAX; idx++) {
+    for (idx = 0; idx < RDMA_WRID_MAX; idx++) {
         ret = qemu_rdma_reg_control(rdma, idx);
         if (ret) {
             fprintf(stderr, "rdma: error registering %d control!\n", idx);
-- 
1.7.10.4

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

* [Qemu-devel] [PATCH v3 For-1.6 6/7] rdma: use RDMA_WRID_READY
  2013-08-04  2:54 [Qemu-devel] [PATCH v3 For-1.6 0/7] rdma: bugfixes, cleanups, IPv6 support mrhines
                   ` (4 preceding siblings ...)
  2013-08-04  2:54 ` [Qemu-devel] [PATCH v3 For-1.6 5/7] rdma: qemu_rdma_post_send_control uses wrongly RDMA_WRID_MAX mrhines
@ 2013-08-04  2:54 ` mrhines
  2013-08-04  2:54 ` [Qemu-devel] [PATCH v3 For-1.6 7/7] rdma: memory leak RDMAContext::host mrhines
  2013-08-14 16:27 ` [Qemu-devel] [PATCH v3 For-1.6 0/7] rdma: bugfixes, cleanups, IPv6 support Anthony Liguori
  7 siblings, 0 replies; 13+ messages in thread
From: mrhines @ 2013-08-04  2:54 UTC (permalink / raw)
  To: qemu-devel; +Cc: yamahata, aliguori, quintela, owasserm, mrhines, pbonzini

From: Isaku Yamahata <yamahata@private.email.ne.jp>

Reviewed-by: Michael R. Hines <mrhines@us.ibm.com>
Signed-off-by: Isaku Yamahata <yamahata@private.email.ne.jp>
Signed-off-by: Michael R. Hines <mrhines@us.ibm.com>
---
 migration-rdma.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/migration-rdma.c b/migration-rdma.c
index ea16f0e..6afe98c 100644
--- a/migration-rdma.c
+++ b/migration-rdma.c
@@ -2223,7 +2223,7 @@ static int qemu_rdma_connect(RDMAContext *rdma, Error **errp)
 
     rdma_ack_cm_event(cm_event);
 
-    ret = qemu_rdma_post_recv_control(rdma, 0);
+    ret = qemu_rdma_post_recv_control(rdma, RDMA_WRID_READY);
     if (ret) {
         ERROR(errp, "posting second control recv!");
         goto err_rdma_source_connect;
@@ -2735,7 +2735,7 @@ static int qemu_rdma_accept(RDMAContext *rdma)
 
     rdma_ack_cm_event(cm_event);
 
-    ret = qemu_rdma_post_recv_control(rdma, 0);
+    ret = qemu_rdma_post_recv_control(rdma, RDMA_WRID_READY);
     if (ret) {
         fprintf(stderr, "rdma migration: error posting second control recv!\n");
         goto err_rdma_dest_wait;
-- 
1.7.10.4

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

* [Qemu-devel] [PATCH v3 For-1.6 7/7] rdma: memory leak RDMAContext::host
  2013-08-04  2:54 [Qemu-devel] [PATCH v3 For-1.6 0/7] rdma: bugfixes, cleanups, IPv6 support mrhines
                   ` (5 preceding siblings ...)
  2013-08-04  2:54 ` [Qemu-devel] [PATCH v3 For-1.6 6/7] rdma: use RDMA_WRID_READY mrhines
@ 2013-08-04  2:54 ` mrhines
  2013-08-14 16:27 ` [Qemu-devel] [PATCH v3 For-1.6 0/7] rdma: bugfixes, cleanups, IPv6 support Anthony Liguori
  7 siblings, 0 replies; 13+ messages in thread
From: mrhines @ 2013-08-04  2:54 UTC (permalink / raw)
  To: qemu-devel; +Cc: yamahata, aliguori, quintela, owasserm, mrhines, pbonzini

From: Isaku Yamahata <yamahata@private.email.ne.jp>

It is allocated by g_strdup(), so needs to be freed.

Reviewed-by: Michael R. Hines <mrhines@us.ibm.com>
Signed-off-by: Isaku Yamahata <yamahata@private.email.ne.jp>
Signed-off-by: Michael R. Hines <mrhines@us.ibm.com>
---
 migration-rdma.c |    2 ++
 1 file changed, 2 insertions(+)

diff --git a/migration-rdma.c b/migration-rdma.c
index 6afe98c..ff0a823 100644
--- a/migration-rdma.c
+++ b/migration-rdma.c
@@ -2097,6 +2097,8 @@ static void qemu_rdma_cleanup(RDMAContext *rdma)
         rdma_destroy_event_channel(rdma->channel);
         rdma->channel = NULL;
     }
+    g_free(rdma->host);
+    rdma->host = NULL;
 }
 
 
-- 
1.7.10.4

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

* Re: [Qemu-devel] [PATCH v3 For-1.6 1/7] rdma: bugfix: make IPv6 support work
  2013-08-04  2:54 ` [Qemu-devel] [PATCH v3 For-1.6 1/7] rdma: bugfix: make IPv6 support work mrhines
@ 2013-08-07  8:39   ` Orit Wasserman
  2013-08-07 14:53     ` Michael R. Hines
  0 siblings, 1 reply; 13+ messages in thread
From: Orit Wasserman @ 2013-08-07  8:39 UTC (permalink / raw)
  To: mrhines; +Cc: yamahata, aliguori, quintela, qemu-devel, mrhines, pbonzini

On 08/04/2013 05:54 AM, mrhines@linux.vnet.ibm.com wrote:
> From: "Michael R. Hines" <mrhines@us.ibm.com>
> 
> RDMA does not use sockets, so we cannot use many of the socket
> helper functions, but we *do* use inet_parse() which gives
> RDMA all the necessary details of the connection parameters.
> 
> However, when testing with libvirt, a simple IPv6 migration test failed
> because we were not using getaddrinfo() properly.
> 
> This makes IPv6 migration over RDMA work.
> 
> Signed-off-by: Michael R. Hines <mrhines@us.ibm.com>
> ---
>  migration-rdma.c |   33 +++++++++++++++++++++------------
>  1 file changed, 21 insertions(+), 12 deletions(-)
> 
> diff --git a/migration-rdma.c b/migration-rdma.c
> index d044830..9cf73e3 100644
> --- a/migration-rdma.c
> +++ b/migration-rdma.c
> @@ -392,6 +392,7 @@ typedef struct RDMAContext {
>      uint64_t unregistrations[RDMA_SIGNALED_SEND_MAX];
>  
>      GHashTable *blockmap;
> +    bool ipv6;
>  } RDMAContext;
>  
>  /*
> @@ -744,6 +745,7 @@ static int qemu_rdma_resolve_host(RDMAContext *rdma, Error **errp)
>      char port_str[16];
>      struct rdma_cm_event *cm_event;
>      char ip[40] = "unknown";
> +    int af = rdma->ipv6 ? PF_INET6 : PF_INET;
>  
>      if (rdma->host == NULL || !strcmp(rdma->host, "")) {
>          ERROR(errp, "RDMA hostname has not been set\n");
> @@ -773,7 +775,7 @@ static int qemu_rdma_resolve_host(RDMAContext *rdma, Error **errp)
>          goto err_resolve_get_addr;
>      }
>  
> -    inet_ntop(AF_INET, &((struct sockaddr_in *) res->ai_addr)->sin_addr,
> +    inet_ntop(af, &((struct sockaddr_in *) res->ai_addr)->sin_addr,
>                                  ip, sizeof ip);
>      DPRINTF("%s => %s\n", rdma->host, ip);
>  
> @@ -2236,9 +2238,12 @@ err_rdma_source_connect:
>  static int qemu_rdma_dest_init(RDMAContext *rdma, Error **errp)
>  {
>      int ret = -EINVAL, idx;
> +    int af = rdma->ipv6 ? PF_INET6 : PF_INET;
>      struct sockaddr_in sin;
>      struct rdma_cm_id *listen_id;
>      char ip[40] = "unknown";
> +    struct addrinfo *res;
> +    char port_str[16];
>  
>      for (idx = 0; idx <= RDMA_WRID_MAX; idx++) {
>          rdma->wr_data[idx].control_len = 0;
> @@ -2266,27 +2271,30 @@ static int qemu_rdma_dest_init(RDMAContext *rdma, Error **errp)
>      }
>  
>      memset(&sin, 0, sizeof(sin));
> -    sin.sin_family = AF_INET;
> +    sin.sin_family = af;
>      sin.sin_port = htons(rdma->port);
> +    snprintf(port_str, 16, "%d", rdma->port);
> +    port_str[15] = '\0';
>  
>      if (rdma->host && strcmp("", rdma->host)) {
> -        struct hostent *dest_addr;
> -        dest_addr = gethostbyname(rdma->host);
> -        if (!dest_addr) {
> -            ERROR(errp, "migration could not gethostbyname!\n");
> -            ret = -EINVAL;
> +        ret = getaddrinfo(rdma->host, port_str, NULL, &res);

Hi Michael,

getaddrinfo can return a list of addresses, you need to handle it.
Look at qemu-sockets.c for example.

Regards,
Orit
> +        if (ret < 0) {
> +            ERROR(errp, "could not getaddrinfo address %s\n", rdma->host);
>              goto err_dest_init_bind_addr;
>          }
> -        memcpy(&sin.sin_addr.s_addr, dest_addr->h_addr,
> -                dest_addr->h_length);
> -        inet_ntop(AF_INET, dest_addr->h_addr, ip, sizeof ip);
> +
> +
> +        inet_ntop(af, &((struct sockaddr_in *) res->ai_addr)->sin_addr,
> +                                    ip, sizeof ip);
>      } else {
> -        sin.sin_addr.s_addr = INADDR_ANY;
> +        ERROR(errp, "migration host and port not specified!\n");
> +        ret = -EINVAL;
> +        goto err_dest_init_bind_addr;
>      }
>  
>      DPRINTF("%s => %s\n", rdma->host, ip);
>  
> -    ret = rdma_bind_addr(listen_id, (struct sockaddr *)&sin);
> +    ret = rdma_bind_addr(listen_id, res->ai_addr);
>      if (ret) {
>          ERROR(errp, "Error: could not rdma_bind_addr!\n");
>          goto err_dest_init_bind_addr;
> @@ -2321,6 +2329,7 @@ static void *qemu_rdma_data_init(const char *host_port, Error **errp)
>          if (addr != NULL) {
>              rdma->port = atoi(addr->port);
>              rdma->host = g_strdup(addr->host);
> +            rdma->ipv6 = addr->ipv6;
>          } else {
>              ERROR(errp, "bad RDMA migration address '%s'", host_port);
>              g_free(rdma);
> 

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

* Re: [Qemu-devel] [PATCH v3 For-1.6 2/7] rdma: forgot to turn off the debugging flag
  2013-08-04  2:54 ` [Qemu-devel] [PATCH v3 For-1.6 2/7] rdma: forgot to turn off the debugging flag mrhines
@ 2013-08-07  8:39   ` Orit Wasserman
  0 siblings, 0 replies; 13+ messages in thread
From: Orit Wasserman @ 2013-08-07  8:39 UTC (permalink / raw)
  To: mrhines; +Cc: yamahata, aliguori, quintela, qemu-devel, mrhines, pbonzini

On 08/04/2013 05:54 AM, mrhines@linux.vnet.ibm.com wrote:
> From: "Michael R. Hines" <mrhines@us.ibm.com>
> 
> Ooops. We forgot to turn off the flag.
> 
> Signed-off-by: Michael R. Hines <mrhines@us.ibm.com>
> ---
>  migration-rdma.c |    2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/migration-rdma.c b/migration-rdma.c
> index 9cf73e3..fe6118d 100644
> --- a/migration-rdma.c
> +++ b/migration-rdma.c
> @@ -27,7 +27,7 @@
>  #include <string.h>
>  #include <rdma/rdma_cma.h>
>  
> -#define DEBUG_RDMA
> +//#define DEBUG_RDMA
>  //#define DEBUG_RDMA_VERBOSE
>  //#define DEBUG_RDMA_REALLY_VERBOSE
>  
> 

Reviewed-by: Orit Wasserman <owasserm@redhat.com>

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

* Re: [Qemu-devel] [PATCH v3 For-1.6 3/7] rdma: correct newlines in error statements
  2013-08-04  2:54 ` [Qemu-devel] [PATCH v3 For-1.6 3/7] rdma: correct newlines in error statements mrhines
@ 2013-08-07  8:45   ` Orit Wasserman
  0 siblings, 0 replies; 13+ messages in thread
From: Orit Wasserman @ 2013-08-07  8:45 UTC (permalink / raw)
  To: mrhines; +Cc: yamahata, aliguori, quintela, qemu-devel, mrhines, pbonzini

On 08/04/2013 05:54 AM, mrhines@linux.vnet.ibm.com wrote:
> From: "Michael R. Hines" <mrhines@us.ibm.com>
> 
> Don't print newlines on the error_setg() function,
> but still allow newlines on fprintf().
> 
> Signed-off-by: Michael R. Hines <mrhines@us.ibm.com>
> ---
>  migration-rdma.c |   68 +++++++++++++++++++++++++++---------------------------
>  1 file changed, 34 insertions(+), 34 deletions(-)
> 
> diff --git a/migration-rdma.c b/migration-rdma.c
> index fe6118d..c958e5f 100644
> --- a/migration-rdma.c
> +++ b/migration-rdma.c
> @@ -60,7 +60,7 @@
>   */
>  #define ERROR(errp, fmt, ...) \
>      do { \
> -        fprintf(stderr, "RDMA ERROR: " fmt, ## __VA_ARGS__); \
> +        fprintf(stderr, "RDMA ERROR: " fmt "\n", ## __VA_ARGS__); \
>          if (errp && (*(errp) == NULL)) { \
>              error_setg(errp, "RDMA ERROR: " fmt, ## __VA_ARGS__); \
>          } \
> @@ -748,21 +748,21 @@ static int qemu_rdma_resolve_host(RDMAContext *rdma, Error **errp)
>      int af = rdma->ipv6 ? PF_INET6 : PF_INET;
>  
>      if (rdma->host == NULL || !strcmp(rdma->host, "")) {
> -        ERROR(errp, "RDMA hostname has not been set\n");
> +        ERROR(errp, "RDMA hostname has not been set");
>          return -1;
>      }
>  
>      /* create CM channel */
>      rdma->channel = rdma_create_event_channel();
>      if (!rdma->channel) {
> -        ERROR(errp, "could not create CM channel\n");
> +        ERROR(errp, "could not create CM channel");
>          return -1;
>      }
>  
>      /* create CM id */
>      ret = rdma_create_id(rdma->channel, &rdma->cm_id, NULL, RDMA_PS_TCP);
>      if (ret) {
> -        ERROR(errp, "could not create channel id\n");
> +        ERROR(errp, "could not create channel id");
>          goto err_resolve_create_id;
>      }
>  
> @@ -771,7 +771,7 @@ static int qemu_rdma_resolve_host(RDMAContext *rdma, Error **errp)
>  
>      ret = getaddrinfo(rdma->host, port_str, NULL, &res);
>      if (ret < 0) {
> -        ERROR(errp, "could not getaddrinfo address %s\n", rdma->host);
> +        ERROR(errp, "could not getaddrinfo address %s", rdma->host);
>          goto err_resolve_get_addr;
>      }
>  
> @@ -783,7 +783,7 @@ static int qemu_rdma_resolve_host(RDMAContext *rdma, Error **errp)
>      ret = rdma_resolve_addr(rdma->cm_id, NULL, res->ai_addr,
>              RDMA_RESOLVE_TIMEOUT_MS);
>      if (ret) {
> -        ERROR(errp, "could not resolve address %s\n", rdma->host);
> +        ERROR(errp, "could not resolve address %s", rdma->host);
>          goto err_resolve_get_addr;
>      }
>  
> @@ -791,12 +791,12 @@ static int qemu_rdma_resolve_host(RDMAContext *rdma, Error **errp)
>  
>      ret = rdma_get_cm_event(rdma->channel, &cm_event);
>      if (ret) {
> -        ERROR(errp, "could not perform event_addr_resolved\n");
> +        ERROR(errp, "could not perform event_addr_resolved");
>          goto err_resolve_get_addr;
>      }
>  
>      if (cm_event->event != RDMA_CM_EVENT_ADDR_RESOLVED) {
> -        ERROR(errp, "result not equal to event_addr_resolved %s\n",
> +        ERROR(errp, "result not equal to event_addr_resolved %s",
>                  rdma_event_str(cm_event->event));
>          perror("rdma_resolve_addr");
>          goto err_resolve_get_addr;
> @@ -806,17 +806,17 @@ static int qemu_rdma_resolve_host(RDMAContext *rdma, Error **errp)
>      /* resolve route */
>      ret = rdma_resolve_route(rdma->cm_id, RDMA_RESOLVE_TIMEOUT_MS);
>      if (ret) {
> -        ERROR(errp, "could not resolve rdma route\n");
> +        ERROR(errp, "could not resolve rdma route");
>          goto err_resolve_get_addr;
>      }
>  
>      ret = rdma_get_cm_event(rdma->channel, &cm_event);
>      if (ret) {
> -        ERROR(errp, "could not perform event_route_resolved\n");
> +        ERROR(errp, "could not perform event_route_resolved");
>          goto err_resolve_get_addr;
>      }
>      if (cm_event->event != RDMA_CM_EVENT_ROUTE_RESOLVED) {
> -        ERROR(errp, "result not equal to event_route_resolved: %s\n",
> +        ERROR(errp, "result not equal to event_route_resolved: %s",
>                          rdma_event_str(cm_event->event));
>          rdma_ack_cm_event(cm_event);
>          goto err_resolve_get_addr;
> @@ -2117,26 +2117,26 @@ static int qemu_rdma_source_init(RDMAContext *rdma, Error **errp, bool pin_all)
>      if (ret) {
>          ERROR(temp, "rdma migration: error allocating pd and cq! Your mlock()"
>                      " limits may be too low. Please check $ ulimit -a # and "
> -                    "search for 'ulimit -l' in the output\n");
> +                    "search for 'ulimit -l' in the output");
>          goto err_rdma_source_init;
>      }
>  
>      ret = qemu_rdma_alloc_qp(rdma);
>      if (ret) {
> -        ERROR(temp, "rdma migration: error allocating qp!\n");
> +        ERROR(temp, "rdma migration: error allocating qp!");
>          goto err_rdma_source_init;
>      }
>  
>      ret = qemu_rdma_init_ram_blocks(rdma);
>      if (ret) {
> -        ERROR(temp, "rdma migration: error initializing ram blocks!\n");
> +        ERROR(temp, "rdma migration: error initializing ram blocks!");
>          goto err_rdma_source_init;
>      }
>  
>      for (idx = 0; idx <= RDMA_WRID_MAX; idx++) {
>          ret = qemu_rdma_reg_control(rdma, idx);
>          if (ret) {
> -            ERROR(temp, "rdma migration: error registering %d control!\n",
> +            ERROR(temp, "rdma migration: error registering %d control!",
>                                                              idx);
>              goto err_rdma_source_init;
>          }
> @@ -2178,7 +2178,7 @@ static int qemu_rdma_connect(RDMAContext *rdma, Error **errp)
>      ret = rdma_connect(rdma->cm_id, &conn_param);
>      if (ret) {
>          perror("rdma_connect");
> -        ERROR(errp, "connecting to destination!\n");
> +        ERROR(errp, "connecting to destination!");
>          rdma_destroy_id(rdma->cm_id);
>          rdma->cm_id = NULL;
>          goto err_rdma_source_connect;
> @@ -2187,7 +2187,7 @@ static int qemu_rdma_connect(RDMAContext *rdma, Error **errp)
>      ret = rdma_get_cm_event(rdma->channel, &cm_event);
>      if (ret) {
>          perror("rdma_get_cm_event after rdma_connect");
> -        ERROR(errp, "connecting to destination!\n");
> +        ERROR(errp, "connecting to destination!");
>          rdma_ack_cm_event(cm_event);
>          rdma_destroy_id(rdma->cm_id);
>          rdma->cm_id = NULL;
> @@ -2196,7 +2196,7 @@ static int qemu_rdma_connect(RDMAContext *rdma, Error **errp)
>  
>      if (cm_event->event != RDMA_CM_EVENT_ESTABLISHED) {
>          perror("rdma_get_cm_event != EVENT_ESTABLISHED after rdma_connect");
> -        ERROR(errp, "connecting to destination!\n");
> +        ERROR(errp, "connecting to destination!");
>          rdma_ack_cm_event(cm_event);
>          rdma_destroy_id(rdma->cm_id);
>          rdma->cm_id = NULL;
> @@ -2212,7 +2212,7 @@ static int qemu_rdma_connect(RDMAContext *rdma, Error **errp)
>       */
>      if (rdma->pin_all && !(cap.flags & RDMA_CAPABILITY_PIN_ALL)) {
>          ERROR(errp, "Server cannot support pinning all memory. "
> -                        "Will register memory dynamically.\n");
> +                        "Will register memory dynamically.");
>          rdma->pin_all = false;
>      }
>  
> @@ -2222,7 +2222,7 @@ static int qemu_rdma_connect(RDMAContext *rdma, Error **errp)
>  
>      ret = qemu_rdma_post_recv_control(rdma, 0);
>      if (ret) {
> -        ERROR(errp, "posting second control recv!\n");
> +        ERROR(errp, "posting second control recv!");
>          goto err_rdma_source_connect;
>      }
>  
> @@ -2251,14 +2251,14 @@ static int qemu_rdma_dest_init(RDMAContext *rdma, Error **errp)
>      }
>  
>      if (rdma->host == NULL) {
> -        ERROR(errp, "RDMA host is not set!\n");
> +        ERROR(errp, "RDMA host is not set!");
>          rdma->error_state = -EINVAL;
>          return -1;
>      }
>      /* create CM channel */
>      rdma->channel = rdma_create_event_channel();
>      if (!rdma->channel) {
> -        ERROR(errp, "could not create rdma event channel\n");
> +        ERROR(errp, "could not create rdma event channel");
>          rdma->error_state = -EINVAL;
>          return -1;
>      }
> @@ -2266,7 +2266,7 @@ static int qemu_rdma_dest_init(RDMAContext *rdma, Error **errp)
>      /* create CM id */
>      ret = rdma_create_id(rdma->channel, &listen_id, NULL, RDMA_PS_TCP);
>      if (ret) {
> -        ERROR(errp, "could not create cm_id!\n");
> +        ERROR(errp, "could not create cm_id!");
>          goto err_dest_init_create_listen_id;
>      }
>  
> @@ -2279,7 +2279,7 @@ static int qemu_rdma_dest_init(RDMAContext *rdma, Error **errp)
>      if (rdma->host && strcmp("", rdma->host)) {
>          ret = getaddrinfo(rdma->host, port_str, NULL, &res);
>          if (ret < 0) {
> -            ERROR(errp, "could not getaddrinfo address %s\n", rdma->host);
> +            ERROR(errp, "could not getaddrinfo address %s", rdma->host);
>              goto err_dest_init_bind_addr;
>          }
>  
> @@ -2287,7 +2287,7 @@ static int qemu_rdma_dest_init(RDMAContext *rdma, Error **errp)
>          inet_ntop(af, &((struct sockaddr_in *) res->ai_addr)->sin_addr,
>                                      ip, sizeof ip);
>      } else {
> -        ERROR(errp, "migration host and port not specified!\n");
> +        ERROR(errp, "migration host and port not specified!");
>          ret = -EINVAL;
>          goto err_dest_init_bind_addr;
>      }
> @@ -2296,7 +2296,7 @@ static int qemu_rdma_dest_init(RDMAContext *rdma, Error **errp)
>  
>      ret = rdma_bind_addr(listen_id, res->ai_addr);
>      if (ret) {
> -        ERROR(errp, "Error: could not rdma_bind_addr!\n");
> +        ERROR(errp, "Error: could not rdma_bind_addr!");
>          goto err_dest_init_bind_addr;
>      }
>  
> @@ -3036,7 +3036,7 @@ static int qemu_rdma_registration_stop(QEMUFile *f, void *opaque,
>                      &reg_result_idx, rdma->pin_all ?
>                      qemu_rdma_reg_whole_ram_blocks : NULL);
>          if (ret < 0) {
> -            ERROR(errp, "receiving remote info!\n");
> +            ERROR(errp, "receiving remote info!");
>              return ret;
>          }
>  
> @@ -3061,7 +3061,7 @@ static int qemu_rdma_registration_stop(QEMUFile *f, void *opaque,
>          if (local->nb_blocks != nb_remote_blocks) {
>              ERROR(errp, "ram blocks mismatch #1! "
>                          "Your QEMU command line parameters are probably "
> -                        "not identical on both the source and destination.\n");
> +                        "not identical on both the source and destination.");
>              return -EINVAL;
>          }
>  
> @@ -3077,7 +3077,7 @@ static int qemu_rdma_registration_stop(QEMUFile *f, void *opaque,
>                  if (rdma->block[i].length != local->block[j].length) {
>                      ERROR(errp, "ram blocks mismatch #2! "
>                          "Your QEMU command line parameters are probably "
> -                        "not identical on both the source and destination.\n");
> +                        "not identical on both the source and destination.");
>                      return -EINVAL;
>                  }
>                  local->block[j].remote_host_addr =
> @@ -3089,7 +3089,7 @@ static int qemu_rdma_registration_stop(QEMUFile *f, void *opaque,
>              if (j >= local->nb_blocks) {
>                  ERROR(errp, "ram blocks mismatch #3! "
>                          "Your QEMU command line parameters are probably "
> -                        "not identical on both the source and destination.\n");
> +                        "not identical on both the source and destination.");
>                  return -EINVAL;
>              }
>          }
> @@ -3163,7 +3163,7 @@ static void rdma_accept_incoming_migration(void *opaque)
>      ret = qemu_rdma_accept(rdma);
>  
>      if (ret) {
> -        ERROR(errp, "RDMA Migration initialization failed!\n");
> +        ERROR(errp, "RDMA Migration initialization failed!");
>          return;
>      }
>  
> @@ -3171,7 +3171,7 @@ static void rdma_accept_incoming_migration(void *opaque)
>  
>      f = qemu_fopen_rdma(rdma, "rb");
>      if (f == NULL) {
> -        ERROR(errp, "could not qemu_fopen_rdma!\n");
> +        ERROR(errp, "could not qemu_fopen_rdma!");
>          qemu_rdma_cleanup(rdma);
>          return;
>      }
> @@ -3204,7 +3204,7 @@ void rdma_start_incoming_migration(const char *host_port, Error **errp)
>      ret = rdma_listen(rdma->listen_id, 5);
>  
>      if (ret) {
> -        ERROR(errp, "listening on socket!\n");
> +        ERROR(errp, "listening on socket!");
>          goto err;
>      }
>  
> @@ -3228,7 +3228,7 @@ void rdma_start_outgoing_migration(void *opaque,
>      int ret = 0;
>  
>      if (rdma == NULL) {
> -        ERROR(temp, "Failed to initialize RDMA data structures! %d\n", ret);
> +        ERROR(temp, "Failed to initialize RDMA data structures! %d", ret);
>          goto err;
>      }
>  
> 

Reviewed-by: Orit Wasserman <owasserm@redhat.com>

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

* Re: [Qemu-devel] [PATCH v3 For-1.6 1/7] rdma: bugfix: make IPv6 support work
  2013-08-07  8:39   ` Orit Wasserman
@ 2013-08-07 14:53     ` Michael R. Hines
  0 siblings, 0 replies; 13+ messages in thread
From: Michael R. Hines @ 2013-08-07 14:53 UTC (permalink / raw)
  To: Orit Wasserman
  Cc: yamahata, aliguori, quintela, qemu-devel, mrhines, pbonzini

On 08/07/2013 04:39 AM, Orit Wasserman wrote:
> On 08/04/2013 05:54 AM, mrhines@linux.vnet.ibm.com wrote:
>> From: "Michael R. Hines" <mrhines@us.ibm.com>
>>
>> RDMA does not use sockets, so we cannot use many of the socket
>> helper functions, but we *do* use inet_parse() which gives
>> RDMA all the necessary details of the connection parameters.
>>
>> However, when testing with libvirt, a simple IPv6 migration test failed
>> because we were not using getaddrinfo() properly.
>>
>> This makes IPv6 migration over RDMA work.
>>
>> Signed-off-by: Michael R. Hines <mrhines@us.ibm.com>
>> ---
>>   migration-rdma.c |   33 +++++++++++++++++++++------------
>>   1 file changed, 21 insertions(+), 12 deletions(-)
>>
>> diff --git a/migration-rdma.c b/migration-rdma.c
>> index d044830..9cf73e3 100644
>> --- a/migration-rdma.c
>> +++ b/migration-rdma.c
>> @@ -392,6 +392,7 @@ typedef struct RDMAContext {
>>       uint64_t unregistrations[RDMA_SIGNALED_SEND_MAX];
>>   
>>       GHashTable *blockmap;
>> +    bool ipv6;
>>   } RDMAContext;
>>   
>>   /*
>> @@ -744,6 +745,7 @@ static int qemu_rdma_resolve_host(RDMAContext *rdma, Error **errp)
>>       char port_str[16];
>>       struct rdma_cm_event *cm_event;
>>       char ip[40] = "unknown";
>> +    int af = rdma->ipv6 ? PF_INET6 : PF_INET;
>>   
>>       if (rdma->host == NULL || !strcmp(rdma->host, "")) {
>>           ERROR(errp, "RDMA hostname has not been set\n");
>> @@ -773,7 +775,7 @@ static int qemu_rdma_resolve_host(RDMAContext *rdma, Error **errp)
>>           goto err_resolve_get_addr;
>>       }
>>   
>> -    inet_ntop(AF_INET, &((struct sockaddr_in *) res->ai_addr)->sin_addr,
>> +    inet_ntop(af, &((struct sockaddr_in *) res->ai_addr)->sin_addr,
>>                                   ip, sizeof ip);
>>       DPRINTF("%s => %s\n", rdma->host, ip);
>>   
>> @@ -2236,9 +2238,12 @@ err_rdma_source_connect:
>>   static int qemu_rdma_dest_init(RDMAContext *rdma, Error **errp)
>>   {
>>       int ret = -EINVAL, idx;
>> +    int af = rdma->ipv6 ? PF_INET6 : PF_INET;
>>       struct sockaddr_in sin;
>>       struct rdma_cm_id *listen_id;
>>       char ip[40] = "unknown";
>> +    struct addrinfo *res;
>> +    char port_str[16];
>>   
>>       for (idx = 0; idx <= RDMA_WRID_MAX; idx++) {
>>           rdma->wr_data[idx].control_len = 0;
>> @@ -2266,27 +2271,30 @@ static int qemu_rdma_dest_init(RDMAContext *rdma, Error **errp)
>>       }
>>   
>>       memset(&sin, 0, sizeof(sin));
>> -    sin.sin_family = AF_INET;
>> +    sin.sin_family = af;
>>       sin.sin_port = htons(rdma->port);
>> +    snprintf(port_str, 16, "%d", rdma->port);
>> +    port_str[15] = '\0';
>>   
>>       if (rdma->host && strcmp("", rdma->host)) {
>> -        struct hostent *dest_addr;
>> -        dest_addr = gethostbyname(rdma->host);
>> -        if (!dest_addr) {
>> -            ERROR(errp, "migration could not gethostbyname!\n");
>> -            ret = -EINVAL;
>> +        ret = getaddrinfo(rdma->host, port_str, NULL, &res);
> Hi Michael,
>
> getaddrinfo can return a list of addresses, you need to handle it.
> Look at qemu-sockets.c for example.
>
> Regards,
> Orit
>> +        if (ret < 0) {
>> +            ERROR(errp, "could not getaddrinfo address %s\n", rdma->host);
>>               goto err_dest_init_bind_addr;
>>           }
>> -        memcpy(&sin.sin_addr.s_addr, dest_addr->h_addr,
>> -                dest_addr->h_length);
>> -        inet_ntop(AF_INET, dest_addr->h_addr, ip, sizeof ip);
>> +
>> +
>> +        inet_ntop(af, &((struct sockaddr_in *) res->ai_addr)->sin_addr,
>> +                                    ip, sizeof ip);
>>       } else {
>> -        sin.sin_addr.s_addr = INADDR_ANY;
>> +        ERROR(errp, "migration host and port not specified!\n");
>> +        ret = -EINVAL;
>> +        goto err_dest_init_bind_addr;
>>       }
>>   
>>       DPRINTF("%s => %s\n", rdma->host, ip);
>>   
>> -    ret = rdma_bind_addr(listen_id, (struct sockaddr *)&sin);
>> +    ret = rdma_bind_addr(listen_id, res->ai_addr);
>>       if (ret) {
>>           ERROR(errp, "Error: could not rdma_bind_addr!\n");
>>           goto err_dest_init_bind_addr;
>> @@ -2321,6 +2329,7 @@ static void *qemu_rdma_data_init(const char *host_port, Error **errp)
>>           if (addr != NULL) {
>>               rdma->port = atoi(addr->port);
>>               rdma->host = g_strdup(addr->host);
>> +            rdma->ipv6 = addr->ipv6;
>>           } else {
>>               ERROR(errp, "bad RDMA migration address '%s'", host_port);
>>               g_free(rdma);
>>
>

Acknowledged.

- Michael

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

* Re: [Qemu-devel] [PATCH v3 For-1.6 0/7] rdma: bugfixes, cleanups, IPv6 support
  2013-08-04  2:54 [Qemu-devel] [PATCH v3 For-1.6 0/7] rdma: bugfixes, cleanups, IPv6 support mrhines
                   ` (6 preceding siblings ...)
  2013-08-04  2:54 ` [Qemu-devel] [PATCH v3 For-1.6 7/7] rdma: memory leak RDMAContext::host mrhines
@ 2013-08-14 16:27 ` Anthony Liguori
  7 siblings, 0 replies; 13+ messages in thread
From: Anthony Liguori @ 2013-08-14 16:27 UTC (permalink / raw)
  To: mrhines, qemu-devel
  Cc: yamahata, aliguori, quintela, owasserm, mrhines, pbonzini

Applied.  Thanks.

Regards,

Anthony Liguori

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

end of thread, other threads:[~2013-08-14 16:28 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-08-04  2:54 [Qemu-devel] [PATCH v3 For-1.6 0/7] rdma: bugfixes, cleanups, IPv6 support mrhines
2013-08-04  2:54 ` [Qemu-devel] [PATCH v3 For-1.6 1/7] rdma: bugfix: make IPv6 support work mrhines
2013-08-07  8:39   ` Orit Wasserman
2013-08-07 14:53     ` Michael R. Hines
2013-08-04  2:54 ` [Qemu-devel] [PATCH v3 For-1.6 2/7] rdma: forgot to turn off the debugging flag mrhines
2013-08-07  8:39   ` Orit Wasserman
2013-08-04  2:54 ` [Qemu-devel] [PATCH v3 For-1.6 3/7] rdma: correct newlines in error statements mrhines
2013-08-07  8:45   ` Orit Wasserman
2013-08-04  2:54 ` [Qemu-devel] [PATCH v3 For-1.6 4/7] rdma: don't use negative index to array mrhines
2013-08-04  2:54 ` [Qemu-devel] [PATCH v3 For-1.6 5/7] rdma: qemu_rdma_post_send_control uses wrongly RDMA_WRID_MAX mrhines
2013-08-04  2:54 ` [Qemu-devel] [PATCH v3 For-1.6 6/7] rdma: use RDMA_WRID_READY mrhines
2013-08-04  2:54 ` [Qemu-devel] [PATCH v3 For-1.6 7/7] rdma: memory leak RDMAContext::host mrhines
2013-08-14 16:27 ` [Qemu-devel] [PATCH v3 For-1.6 0/7] rdma: bugfixes, cleanups, IPv6 support Anthony Liguori

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).