All of lore.kernel.org
 help / color / mirror / Atom feed
From: Orit Wasserman <owasserm@redhat.com>
To: "Michael R. Hines" <mrhines@linux.vnet.ibm.com>
Cc: pbonzini@redhat.com, aliguori@us.ibm.com, quintela@redhat.com,
	qemu-devel@nongnu.org, mrhines@us.ibm.com
Subject: Re: [Qemu-devel] [PATCH] rdma: bugfix: make IPv6 support work
Date: Tue, 30 Jul 2013 18:31:48 +0300	[thread overview]
Message-ID: <51F7DC64.9060604@redhat.com> (raw)
In-Reply-To: <51F7D470.6050708@linux.vnet.ibm.com>

On 07/30/2013 05:57 PM, Michael R. Hines wrote:
> On 07/30/2013 04:14 AM, Orit Wasserman wrote:
>> On 07/27/2013 05:23 AM, mrhines@linux.vnet.ibm.com wrote:
>>> From: "Michael R. Hines" <mrhines@us.ibm.com>
>>>
>>> When testing with libvirt, a simple IPv6 migration test failed
>>> because we were not using getaddrinfo() properly.
>>> This makes IPv6 migration over RDMA work.
>>>
>>> Also, we forgot to turn the DPRINTF flag off =).
>>>
>>> Signed-off-by: Michael R. Hines <mrhines@us.ibm.com>
>>> ---
>>>   migration-rdma.c |   35 ++++++++++++++++++++++-------------
>>>   1 file changed, 22 insertions(+), 13 deletions(-)
>>>
>>> diff --git a/migration-rdma.c b/migration-rdma.c
>>> index d044830..3256c9b 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
>> Can you put this in a separate patch?
> 
> Acknowledged.
> 
>>>   //#define DEBUG_RDMA_VERBOSE
>>>   //#define DEBUG_RDMA_REALLY_VERBOSE
>>>   @@ -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;
>> We have code that handles ipv6 in utils/qemu-sockets.c, it also handle host
>> and port parsing please take a look at inet_parse_connect_opts.
>> I think it can be reused here and for the destination.
> 
> RDMA cannot use that function - it creates a socket and RDMA does not use sockets.
> 
> RDMA is *already*, however, using inet_parse() which does exactly what you said.
> 

You can update the function so it can be used for RDMA also.

Orit

>> Regards,
>> Orit
>>>         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);
>>>
> 

  reply	other threads:[~2013-07-30 15:31 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-07-27  2:23 [Qemu-devel] [PATCH] rdma: bugfix: make IPv6 support work mrhines
2013-07-27  2:30 ` Andreas Färber
2013-07-27  2:37   ` Michael R. Hines
2013-07-30  8:14 ` Orit Wasserman
2013-07-30 14:57   ` Michael R. Hines
2013-07-30 15:31     ` Orit Wasserman [this message]
2013-07-31 13:39       ` Michael R. Hines
2013-07-31 16:03         ` Orit Wasserman
2013-08-14 16:29 ` Anthony Liguori

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=51F7DC64.9060604@redhat.com \
    --to=owasserm@redhat.com \
    --cc=aliguori@us.ibm.com \
    --cc=mrhines@linux.vnet.ibm.com \
    --cc=mrhines@us.ibm.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.