From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39382) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V7RSK-0000Ns-1p for qemu-devel@nongnu.org; Thu, 08 Aug 2013 10:44:56 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1V7RSB-00039z-3F for qemu-devel@nongnu.org; Thu, 08 Aug 2013 10:44:48 -0400 Received: from e37.co.us.ibm.com ([32.97.110.158]:43602) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V7RSA-00039d-RB for qemu-devel@nongnu.org; Thu, 08 Aug 2013 10:44:39 -0400 Received: from /spool/local by e37.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 8 Aug 2013 08:44:36 -0600 Received: from d03relay03.boulder.ibm.com (d03relay03.boulder.ibm.com [9.17.195.228]) by d03dlp03.boulder.ibm.com (Postfix) with ESMTP id 956B819D805E for ; Thu, 8 Aug 2013 08:44:21 -0600 (MDT) Received: from d03av04.boulder.ibm.com (d03av04.boulder.ibm.com [9.17.195.170]) by d03relay03.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r78EiWMn120306 for ; Thu, 8 Aug 2013 08:44:33 -0600 Received: from d03av04.boulder.ibm.com (loopback [127.0.0.1]) by d03av04.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r78EiMjR000657 for ; Thu, 8 Aug 2013 08:44:23 -0600 Received: from [172.16.1.222] (klinux.watson.ibm.com [9.2.208.21]) by d03av04.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id r78EiI9f032764 for ; Thu, 8 Aug 2013 08:44:19 -0600 Message-ID: <5203AEBF.8050704@linux.vnet.ibm.com> Date: Thu, 08 Aug 2013 10:44:15 -0400 From: "Michael R. Hines" MIME-Version: 1.0 References: <1375891530-13759-1-git-send-email-mrhines@linux.vnet.ibm.com> <1375891530-13759-5-git-send-email-mrhines@linux.vnet.ibm.com> <520336B0.1080201@redhat.com> In-Reply-To: <520336B0.1080201@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH for-1.6 4/4] rdma: proper getaddrinfo() handling List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org On 08/08/2013 02:12 AM, Orit Wasserman wrote: > On 08/07/2013 07:05 PM, mrhines@linux.vnet.ibm.com wrote: >> From: "Michael R. Hines" >> >> getaddrinfo() already knows what it's doing, >> wqand can potentially return multiple addresses. >> >> Signed-off-by: Michael R. Hines >> --- >> migration-rdma.c | 56 ++++++++++++++++++++++++++++-------------------------- >> 1 file changed, 29 insertions(+), 27 deletions(-) >> >> diff --git a/migration-rdma.c b/migration-rdma.c >> index 30e08cd..d71cca5 100644 >> --- a/migration-rdma.c >> +++ b/migration-rdma.c >> @@ -392,7 +392,6 @@ typedef struct RDMAContext { >> uint64_t unregistrations[RDMA_SIGNALED_SEND_MAX]; >> >> GHashTable *blockmap; >> - bool ipv6; >> } RDMAContext; >> >> /* >> @@ -745,7 +744,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; >> + struct addrinfo *e; >> >> if (rdma->host == NULL || !strcmp(rdma->host, "")) { >> ERROR(errp, "RDMA hostname has not been set"); >> @@ -775,18 +774,23 @@ static int qemu_rdma_resolve_host(RDMAContext *rdma, Error **errp) >> goto err_resolve_get_addr; >> } >> >> - inet_ntop(af, &((struct sockaddr_in *) res->ai_addr)->sin_addr, >> - ip, sizeof ip); >> - DPRINTF("%s => %s\n", rdma->host, ip); >> + for (e = res; e != NULL; e = e->ai_next) { >> + inet_ntop(e->ai_family, >> + &((struct sockaddr_in *) e->ai_addr)->sin_addr, ip, sizeof ip); >> + DPRINTF("Trying %s => %s\n", rdma->host, ip); >> >> - /* resolve the first address */ >> - ret = rdma_resolve_addr(rdma->cm_id, NULL, res->ai_addr, >> - RDMA_RESOLVE_TIMEOUT_MS); >> - if (ret) { >> - ERROR(errp, "could not resolve address %s", rdma->host); >> - goto err_resolve_get_addr; >> + /* resolve the first address */ >> + ret = rdma_resolve_addr(rdma->cm_id, NULL, e->ai_addr, >> + RDMA_RESOLVE_TIMEOUT_MS); >> + if (!ret) { >> + goto route; >> + } >> } >> >> + ERROR(errp, "could not resolve address %s", rdma->host); >> + goto err_resolve_get_addr; >> + >> +route: >> qemu_rdma_dump_gid("source_resolve_addr", rdma->cm_id); >> >> ret = rdma_get_cm_event(rdma->channel, &cm_event); >> @@ -2260,8 +2264,6 @@ 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; >> @@ -2292,35 +2294,36 @@ static int qemu_rdma_dest_init(RDMAContext *rdma, Error **errp) >> goto err_dest_init_create_listen_id; >> } >> >> - memset(&sin, 0, sizeof(sin)); >> - 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 addrinfo *e; >> + >> ret = getaddrinfo(rdma->host, port_str, NULL, &res); >> if (ret < 0) { >> ERROR(errp, "could not getaddrinfo address %s", rdma->host); >> goto err_dest_init_bind_addr; >> } >> >> + for (e = res; e != NULL; e = e->ai_next) { >> + inet_ntop(e->ai_family, >> + &((struct sockaddr_in *) e->ai_addr)->sin_addr, ip, sizeof ip); >> + DPRINTF("Trying %s => %s\n", rdma->host, ip); >> + ret = rdma_bind_addr(listen_id, e->ai_addr); >> + if (!ret) { >> + goto listen; >> + } >> + } >> >> - inet_ntop(af, &((struct sockaddr_in *) res->ai_addr)->sin_addr, >> - ip, sizeof ip); >> + ERROR(errp, "Error: could not rdma_bind_addr!"); >> + goto err_dest_init_bind_addr; >> } else { >> ERROR(errp, "migration host and port not specified!"); >> ret = -EINVAL; >> goto err_dest_init_bind_addr; >> } >> - >> - DPRINTF("%s => %s\n", rdma->host, ip); >> - >> - ret = rdma_bind_addr(listen_id, res->ai_addr); >> - if (ret) { >> - ERROR(errp, "Error: could not rdma_bind_addr!"); >> - goto err_dest_init_bind_addr; >> - } >> +listen: >> >> rdma->listen_id = listen_id; >> qemu_rdma_dump_gid("dest_init", listen_id); >> @@ -2351,7 +2354,6 @@ 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); >> > Looks good, > Reviewed-by: Orit Wasserman > > Thanks.