From: "Michael R. Hines" <mrhines@linux.vnet.ibm.com>
To: Orit Wasserman <owasserm@redhat.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: Wed, 31 Jul 2013 09:39:33 -0400 [thread overview]
Message-ID: <51F91395.9030909@linux.vnet.ibm.com> (raw)
In-Reply-To: <51F7DC64.9060604@redhat.com>
On 07/30/2013 11:31 AM, Orit Wasserman wrote:
> 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.
The inet_parse() function does everything that we need -
it already understands IPv6 without opening an actual socket.
Any more than that would require CONFIG_RDMA to be
conditionalized inside of the utils/ source code,
and that seems like a lot of work for such a small reward.
- Michael
> 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);
>>>>
next prev parent reply other threads:[~2013-07-31 13:39 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
2013-07-31 13:39 ` Michael R. Hines [this message]
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=51F91395.9030909@linux.vnet.ibm.com \
--to=mrhines@linux.vnet.ibm.com \
--cc=aliguori@us.ibm.com \
--cc=mrhines@us.ibm.com \
--cc=owasserm@redhat.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.